一直在从事回合制战斗的RPG页游前端开发,转眼已经三年了,总结记录一下自己的心得,希望也能给别人带来帮助
1. 性能优化
几乎在所有的页游中,我们都会碰到各种各样的性能问题,我们也不例外,游戏的整个性能效率水平都是从小优化中而来,因此先来复习下大部分我所熟知的优化点,这些点你应该页游在其他人的文章中见过
- 在大批量使用事件的情况,我们可以考虑用观察者模式来实现事件机制替代原声的事件机制(这里要注意一个用数组来保存侦听器时,记得在执行侦听器的时候拷贝一份数组,数组遍历删除其中一个侦听器,会导致数组后面的项都会移位)
- 大批量的实例化时,可以考虑池来实现
- 减少Timer的使用,尽量在游戏中统一用一个Timer来管理需要使用Timer的对象。
- 扁平化显示列表。能用bitmap实现,就别在外面包一个Sprite
- 少去修改现实对象层级,减少重绘。
- 将不需要鼠标事件的对象的MouseEnabled, MouseChildren属性全部设置为False。
- 尽量使用内联代码,而不是去if判断或者case判断来确定哪个分支程序应该被执行。
- 在多次重复执行的代码块,可以做一个检查是否相同判断。或者用Event.RENDER事件来确保只在每帧渲染前执行一次。
- 存储数据比较大的话尽量用Vector而不是Array
- 如果有多个实例对象侦听同一个冒泡事件,可以只在父容器建立侦听器就可以。
- 对于 TextField 对象,请使用 appendText() 方法,而不要使用 += 运算符。
上面的这些优化点,有的是优化代码执行效率,有的是优化渲染效率。这些优化的基础是建立在flash AVM机的基础上来说的。要提高AVM机的效率,其实就是要减少FLASH 每一帧的耗时,我们通过scout工具来看看AVM机每一帧做了什么东西
可以看到一个竖条上有橙色,绿色,蓝色
这就是一帧里面各个操作所花费的总时间,橙色代表AVM机自身的耗时,例如垃圾回收,派发原生事件等
绿色代表渲染耗时,主要计算脏矩阵,栅格化边缘;蓝色代表AS代码执行的时间。这三部分的时间总和几乎就是每一帧的总耗时,所以我们优化就是减少这三部分的时间
相关内容请阅读:借助 Adobe Scout 理解 Flash Player
熟悉了AVM机工作的机制,然后分析来进行相应的优化,这是解决性能问题的根本之道。
减少as代码的执行时间,上面已经列举了一些,这里我们增加一些对渲染耗时优化。
渲染的过程主要包括计算脏矩阵,渲染脏矩阵,复制到屏幕,三大部分
而渲染脏矩阵主要包含了2个小步:构建边缘,栅格化像素。
影响这里的主要耗时,主要是在栅格化边缘这一部分。
为了减少每一帧的渲染因此减少脏矩阵的区域,也就是减少重绘的区域,非常重要。
栅格化的时间耗费主要取决于像素数量以及绘制每个像素的成本。绘制纯色的代价最低,而绘制带有多层 alpha 混合的旋转和缩放位图则相当昂贵!
因此减少渲染耗时可以主要从以下几点入手:
1. 减少重绘的机会
2. 减少重绘的区域
3. 减少混合,旋转,变换,缩放,透明等组合,减少显示对象的层数