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

Ref: http://www.flashj.cn/wp/bitmap-render-1500mc.html

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

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

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

3.屏蔽鼠+cacheAsBitmap
    FPS=1,cpu
满,内存156~196M
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

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());
                  }
         }
}

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

核心思路就是把所有显示对象截成位图保存到资源池,到用的时候从里面获取一个副本,一样的BitmapData可以重用。每次渲染的时候操作BitmapData,逐级拷贝像素,组成一帧画面,输出到一个Bitmap上。

优化的几个注意点:

1.减少渲染次数,不要每帧渲染,只要按周期检测是否需要重绘(显示在此屏幕内的对象的位置、大小、帧号发生变化),子级会常常通知重绘,但使用计数器积累到周期再重绘,减少渲染次数。

2.减少渲染面积,每个子对象区域尽量小。当发生显示对象的视图变化时仅对需要变化的区域进行绘制(参考Flashplayer的重绘机制,求出最小边区域,用动态四叉树建立索引检索出需要参与重绘的对象,用来重绘


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值