`

[转]几种位图渲染角色动画的实现方法的性能差异

阅读更多
http://bbs.9ria.com/viewthread.php?tid=77376&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000


今天中午针对3种知道的位图渲染角色动画的实现方法进行了性能测试,这三种方法分别是:

copyPixels,mask和scrollRect

测试素材:800*600位图文件一张
测试方法:对同屏100个对象不停进行渲染,观察CPU和内存的占用情况。渲染速度30FPS

先说下主要的渲染思路:

copyPixels

指定一个缓冲区变量buffer,将其设置为bitmap的bitmapData属性或者设置为Sprite的beginBitmapFill填充对象,之后,从源位图文件中复制对应的像素到buffer中。

类代码如下:
package  
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.geom.Point;
        import flash.geom.Rectangle;
        /**
         * ...
         * @author D5Power
         */
        public class ShowObjectCP extends Bitmap implements Render
        {
                
                private var buffer:BitmapData;
                private var _source:BitmapData;
                
                public function ShowObjectCP(source:BitmapData) 
                {
                        buffer = new BitmapData(40, 40);
                        _source = source;
                        
                        super(buffer);
                }
                
                public function render():void
                {
                        buffer.copyPixels(_source, new Rectangle(int(760 * Math.random()), int(560 * Math.random()), 40, 40), new Point());
                }
                
        }

}


mask

将源位图作为bitmapData,定义一个Bitmap对象,然后在sprite绘制一个矢量区域,来做为遮罩,之后更改Bitmap的坐标,来实现动画。类代码如下:
package  
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        
        /**
         * ...
         * @author D5Power
         */
        public class ShowObjectXY extends Sprite implements Render
        {
                
                private var masker:Sprite;
                private var b:Bitmap;
                public function ShowObjectXY(bitmap:BitmapData) 
                {
                        masker = new Sprite();
                        masker.graphics.beginFill(0);
                        masker.graphics.drawRect(0, 0, 80, 120);
                        
                        addChild(masker);
                        
                        b = new Bitmap(bitmap);
                        addChild(b);
                        
                        b.mask = masker;
                }
                
                public function render():void
                {
                        b.x = -int(760*Math.random());
                        b.y = -int(560*Math.random());
                }
                
        }

}



scrollRect

创建一个Bitmap对象,通过修改其 scrollRect属性来更改当前的显示区域。类代码如下:
package  
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.geom.Rectangle;
        
        /**
         * ...
         * @author Howard.Ren
         */
        public class ShowObjectSC extends Bitmap implements Render
        {
                private var rect:Rectangle;
                public function ShowObjectSC(bitmap:BitmapData) 
                {
                        super(bitmap);
                        rect = new Rectangle(0, 0, 80, 120);
                        scrollRect = rect;
                }
                
                public function render():void
                {
                        rect.x= int(760*Math.random());
                        rect.y = int(560 * Math.random());
                        scrollRect = rect;
                }
                
                
                
        }

}


最后,通过主函数在屏幕上同时渲染100个。
package  
{
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        
        /**
         * ...
         * @author Howard.Ren
         */
        public class Main extends Sprite
        {
                private var list:Array;
                public function Main() 
                {
                        list = new Array();
                        
                        var source:BitmapData = new map(0,0);
                        for (var i:uint = 0; i < 100; i++ )
                        {
                                var obj:ShowObjectCP = new ShowObjectCP(source);
                                obj.x = int(Math.random() * stage.stageWidth);
                                obj.y = int(Math.random() * stage.stageHeight);
                                addChild(obj);
                                list.push(obj);
                        }
                        
                        addEventListener(Event.ENTER_FRAME, doit );
                }
                
                private function doit(e:Event):void
                {
                        for each(var obj:Render in list)
                        {
                                obj.render();
                        }
                }
                
        }

}


运行结果如下:

先来看scrollRect的





再来看mask的





最后来看copyPixels的




其实在运行前,我以为mask的速度会最快,因为只是改动了位图的XY坐标而已,比其他的多了一个mask出来。但是,实际上它的性能跟scrollRect不相上下,怀疑是不是底层是同一实现方法。而copyPixels则稳居第一。只有10%左右的CPU占有。

完毕,上源码。欢迎各路兄弟丢斧头。。。

  • 大小: 107.1 KB
  • 大小: 108.1 KB
  • 大小: 96.8 KB
分享到:
评论

相关推荐

    flash actionscript3游戏开发之 AS3中实现卡马克卷轴算法(横版过关游戏).zip_actionscript什么意思

    然而,即使采用了这些优化手段,大型位图的滚动仍可能在不同硬件上表现出性能差异。例如,一个3000x600像素的位图以60fps滚动可能会占用10%以上的CPU。因此,开发者可能需要尝试更多的优化策略,比如像素滚动和更...

    BitBlt在游戏中的用法

    1. **精灵动画**:通过改变源位图的nXSrc和nYSrc参数,可以实现精灵帧的切换,从而制作出连续的动画效果。 2. **背景滚动**:通过调整nXDest和nYDest,可以实现背景的平滑滚动,给人一种无限延伸的感觉。 3. **...

    内存画布实现双缓冲显示

    总的来说,内存画布和双缓冲技术是提高图形用户界面性能的有效手段,尤其在处理动态图形和动画时,能显著提升用户体验。在VC6环境下,通过熟练掌握这些技术,开发者可以创建出更加流畅、无闪烁的图形应用程序。

    教你怎样在HTML5画布画图

    性能方面,绘制大量图形或实现复杂动画时,应当注意以下几点来优化Canvas的性能: - 将多个绘图操作合并(batching),减少绘图调用次数。 - 避免不必要的画布状态改变,因为这会导致重绘整个画布。 - 只渲染屏幕上...

    HTML5 在游戏开发中的应用

    下面介绍几种核心的技术及其应用场景: ##### Canvas - **绘制几何图形**:通过`canvas.getContext("2d")`获取2D渲染上下文,进而可以绘制各种几何形状。 - **绘制位图**:利用`drawImage`方法可以直接将位图加载到...

    Flex Book Flip Over

    6. **性能优化**:由于翻页动画可能会消耗大量计算资源,因此需要考虑性能优化,比如使用位图缓存、减少不必要的重绘等。 7. **兼容性和适应性**:考虑到不同设备和浏览器的差异,可能需要做相应的适配,确保在各种...

    SVG精髓++第2版

    为了提高SVG图像的加载速度和渲染性能,可以采用以下几种方法进行优化: - **减少SVG文件大小**:通过删除不必要的注释、空白字符以及压缩SVG代码来减小文件大小。 - **使用SVG符号库**:利用 `&lt;symbol&gt;` 和 `&lt;use&gt;`...

    Android开发控件-VarietyImageView(百变ImageView,可以根据要求指定哪个角是圆角,哪个角是直角)

    6. **性能优化**: 由于自定义绘制会增加计算和渲染负担,我们需要优化代码,避免不必要的重绘,例如使用硬件加速,或者在不需要更新圆角时缓存位图。 在提供的"UniversalImageView"文件中,可能包含了这个自定义...

    voImage - wince下显示GIF、JPEG以及其它格式的图像文件

    GIF是一种常见的位图格式,常用于互联网上的动画图片。 2. JPEG支持:voImage也支持JPEG(Joint Photographic Experts Group)格式,这是一种广泛使用的有损压缩图像格式,适用于高质量的照片和图像。 3. 其他格式...

    微型嵌入式GUI(C源代码和资料,1.34M)

    微型嵌入式GUI是一种在资源受限的嵌入式设备上实现图形用户界面(GUI)的技术。这个标题提及的资源包包含C语言编写的源代码和相关的学习资料,可以帮助开发者理解和构建自己的微型GUI系统。嵌入式GUI对于那些需要...

    详解使用canvas保存网页为pdf文件支持跨域

    Canvas是一种基于Web的绘图技术,允许JavaScript代码在HTML的canvas元素中进行图形和动画操作。通过使用canvas的API,开发者可以在网页上绘制图形,实现图像合成等效果。它的一个重要特性是可以将HTML元素渲染为位图...

Global site tag (gtag.js) - Google Analytics