写了个位图缓存优化渲染方案

由于项目中需要用到大量角色同屏幕的功能,需要提高flash player的渲染性能。下午做了个渲染性能测试,并完善了去年写的位图优化代码库。

画面大小2880*2880
500个矢量人物动画MC(嵌套2层),循环播放
都不把屏幕外的区域removeChild
统一是用Flashplayer sa 10.0 debug版测试

1.不优化,直接addChild
    fps=4,CPU占满,内存18M29M
2.增加了cacheAsBitmap
    FPS=1,cpu占满,内存156
196M,内存不断波动

3.屏蔽鼠标+cacheAsBitmap
    FPS=1,cpu占满,内存156196M
4.屏蔽鼠标,无位图缓存
    fps=4,CPU占满,21M
30M

5.使用我去年写的位图显示对象,但没有进行同一个对象的内存重用,导致每次new出来的时候都从源MC实例draw一次内容,脚本执行慢,且内存占用多,一会优化个可重用的再测。
    fps=13,cpu占满,内存476M
6.使用我去年写的位图显示对象,且设置所有角色都在1个屏幕内(场景依然是2880*2880)
    fps=15,cpu占满,内存476M
7.使用我去年写的位图显示对象,且设置所有角色都在1个屏幕内(场景依然是2880*2880),角色数量减少到100
    fps=23,cpu占满,内存186~187M

1,2说明:官方的cacheAsBitmap太耗费内存,而且是play的时候不断创建位图缓存的。
3,4对比1,2说明:屏蔽鼠标在这种未监听且东西多到十分卡的情况下意义不大。
5,6说明: 位图修改的区域越小,fps越高,消耗的内存一样大(整个bitmap)
6,7说明:直接位图操作不会因为同屏幕显示对象数量多而影响效率,与像素复制操作的次数有关

PS: 刚换了10.1 debug SA版,性能降低了1/4

8.增加内存缓存(清除冗余位图)的单帧Image,且绘图区域变小(800*600)
    fps=30,cpu42%左右,内存8M~10M

9.新版位图引擎(加入内存资源池),1500个MC,区域800*600
    fps=30,cpu42%左右,内存10M~12M

最终效果:

1500个MC在同屏幕内播放,额定帧频30。

Document Class :

package
{
import org.mousebomb.Math.MousebombMath;
import org.mousebomb.bmpdisplay.Animation;
import org.mousebomb.bmpdisplay.BmdObject;
import org.mousebomb.bmpdisplay.BmdResourcePool;
import org.mousebomb.bmpdisplay.BmpDisplayObject;
import org.mousebomb.bmpdisplay.Image;
import org.mousebomb.utils.SystemStatus;

import flash.display.Sprite;
import flash.display.StageAlign;

/**
* @author Mousebomb (mousebomb@gmail.com)
* @date 2010-6-21
*/
public class BmdEngineMC extends Sprite
{
/**
* BMD化的测试
*/

private var bmdStage : BmpDisplayObject;
private var bmdRoot : Image;

public function BmdEngineMC()
{
bmdRoot = new Image(800, 600);
bmdStage = new BmpDisplayObject(bmdRoot);
//创建位图序列
var src : MovieClip = new RoleD();
BmdResourcePool.getInstance().regResource(“roleD”, src);
addChild(bmdStage);

for (var i : int = 0;i < 1500;i++)
{
var bmdChild : BmdObject = BmdResourcePool.getInstance().getNewResource(“roleD”);
(bmdChild as Animation).play();
bmdChild.x = MousebombMath.randomFromRange(20, 600);
bmdChild.y = MousebombMath.randomFromRange(20, 550);
bmdRoot.addChild(bmdChild);
}
//开始渲染
bmdStage.renderEnterFrame = true;
this.stage.align = StageAlign.TOP_LEFT;
addChild(SystemStatus.getInstance());
}
}
}

哇哈哈,项目需要的大量角色渲染有戏咧。


技术内容转载请注明来源,个人日记不允许转载,欢迎指出任何有错误或不够清晰的表达。可以邮件至 mousebomb@gmail.com