博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
优化技术之高级优化
阅读量:6096 次
发布时间:2019-06-20

本文共 1388 字,大约阅读时间需要 4 分钟。

2013-06-29

高级优化

 

目前被普遍采用的优化方案有:

1. 优化循环,通过重新组织重复的子表达式来提高循环体的运行性能。

2. 减少使用对象的数量来提高运行性能。

3. 缩减网络传输数据来缩短等待时间等。

 

本文学习另外三种性能优化策略:

1. 采用对象池技术,提高对象的利用率。

本文提出一种对象池技术,将有效解决创建和释放对象带来的性能损失问题。

根据需要先创建一定量的对象,在需要创建对象的时候从池中申请空闲对象,释放对象时把对象释放回池中,以有效避免由创建和释放对象带来的性能损失。

游戏分析:假设同时显示的敌机数量最多不超过5架,采用对象池技术可以先定义一个对象池,容量为同时的敌机的最大数量。

Enemy[] enemyPool = new Enemy[5];

for(int i=0; i<5; i++) {

  enemyPool[i] = new Enemy();

}

在类Enemy里增加标志属性used和带参数的reset方法使对象重置到初始化。在载入游戏的时候,初始化对象池,在需要创建对象的时候从对象池中获取一个未被使用的对象并使用reset方法初始化,需要释放对象的时候只需将修改标志位属性used以供下次使用。使用对象池技术不但减少了相当大一部分的资源开销,而且避免了频繁创建对象的额外资源开销。

2. 尽量使用基本数据类型代替对象。

在游戏中飞机要发射子弹,基于面向对象的设计模式可将子弹抽象成Bullet类,然后定义代表子弹的对象池,在发射子弹的时候,在对象池中查找可用对象并重置其位置为飞机所在的位置。由于对象操作的效率低于对基本数据类型的操作,由此可以想到由基本数据类型来代替对象实现。

int[][] bullet = new int[2][10]; // 假设屏幕同时显示最多10颗子弹

for(int i=0; i<10; i++) {

  bullet[0][i] = 999; // 对应x位置

  bullet[1][i] = 999; // 对应y位置

}

在每一个Game Loop中

while(run) {

for(int i=0; i<10; i++) {

    if(bullet[1][i] == 999) {

      // 设置子弹发射位置为飞机当前的位置

      bullet[0][i] = plane.getX();

      bullet[1][i] = plane.getY();

    } else {

      // 子弹纵坐标减小

      bullet[1][i] –= 10;

    }

  }

}

3. 用简单的数值计算代替复杂的函数计算。

减少函数计算复杂度,减少复杂函数的调用次数,避免使用复杂函数计算,有利于程序性能提高。与复杂函数运算相比,简单的数值计算无论从时间还是空间上都有极大的优势。

由基本的数学原理可知,当角度一定时其对应的三角函数值也是一定的,又因为三角函数是周期函数,因此本文的优化算法是用0度~45度的函数值通过简单的四则运算来模拟任意函数值。

游戏开发性能优化状况:

当前游戏性能的瓶颈在于有限的存储资源和偏弱的处理器速度,而游戏优化的关键之处在于节省资源开销、节省冗余计算和计算简化,所以牺牲部分设计上的结构化换来性能的提升,在当前情况下仍然是非常有必要的。本文提出的优化方法为在较低的硬件条件下实现流畅的画面,提供了可行的解决方案。

转载地址:http://mrgwa.baihongyu.com/

你可能感兴趣的文章
Git [remote rejected] xxxx->xxxx <no such ref>修复了推送分支的错误
查看>>
Porter/Duff,图片加遮罩setColorFilter
查看>>
黄聪:VMware安装Ubuntu10.10【图解】转
查看>>
Centos 6.x 升级openssh版本
查看>>
公式推♂倒题
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
mysql练习题40道
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
abb画学号
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>