这几天一直在Starling引擎的基础上完善游戏逻辑部分,但是当把所有资源铺在stage3D上后发现这帧率不像是一个拥有硬件加速所应该有的样子。电脑帧率只有20帧,更别说iPad2上的了。一般而言iPad2和PC(4核3.2GHZ 4G)相比,帧率一般要少一半。
于是便进入痛苦的代码优化时间。花了整整一个下午,寻找并且优化了两个地方。
其一就是对于addChild和removeChild这两个函数的频繁调用。我的频繁是每一帧都在大量的调用,大量指的是一个MovieClip下的所有显示对象(这里的MovieClip早已不是ActionScript3所提供的2DMovieClip,而是继承自Starling的Sprite自制的MovieClip,使其拥有3D加速功能)。频繁的调用addChild和removeChild会很影响性能。我把这部分的代码优化后,帧率从20帧提高到了30帧。但是还不够,如果PC上运行是30帧iPad2仍然性能很低。在接下来的几个小时里我发现几个赋值语句的执行时间特别长。我将它们注释之后发现帧率突然稳定在60帧。这让我很奇怪。经过多次实验发现ActionScript3对于XML的操作效率是比较低的。比如XML.attribute(),我后来把XML全部进行预处理,就是在loading阶段便把XML所描述的数据结构使用Object来替代。让缓慢的操作全部轰到loading阶段并且只执行一次。
经过这两段代码的优化后发现PC帧率达到58fps,iPad2帧率达到26帧。基本满足游戏的需要。
另外iPad1的性能是iPad2的一半。适应Air3.2在iPad1上稍微做复杂点的游戏很容易出现内存爆掉的情况。
总体感觉ActionScript其实比C++这种语言更需要深厚的基本功,否则制作对性能要求高的东西,在优化阶段会很摸不到头脑。
于是便进入痛苦的代码优化时间。花了整整一个下午,寻找并且优化了两个地方。
其一就是对于addChild和removeChild这两个函数的频繁调用。我的频繁是每一帧都在大量的调用,大量指的是一个MovieClip下的所有显示对象(这里的MovieClip早已不是ActionScript3所提供的2DMovieClip,而是继承自Starling的Sprite自制的MovieClip,使其拥有3D加速功能)。频繁的调用addChild和removeChild会很影响性能。我把这部分的代码优化后,帧率从20帧提高到了30帧。但是还不够,如果PC上运行是30帧iPad2仍然性能很低。在接下来的几个小时里我发现几个赋值语句的执行时间特别长。我将它们注释之后发现帧率突然稳定在60帧。这让我很奇怪。经过多次实验发现ActionScript3对于XML的操作效率是比较低的。比如XML.attribute(),我后来把XML全部进行预处理,就是在loading阶段便把XML所描述的数据结构使用Object来替代。让缓慢的操作全部轰到loading阶段并且只执行一次。
经过这两段代码的优化后发现PC帧率达到58fps,iPad2帧率达到26帧。基本满足游戏的需要。
另外iPad1的性能是iPad2的一半。适应Air3.2在iPad1上稍微做复杂点的游戏很容易出现内存爆掉的情况。
总体感觉ActionScript其实比C++这种语言更需要深厚的基本功,否则制作对性能要求高的东西,在优化阶段会很摸不到头脑。