as3中两种位图渲染

谨以此文对Flash的总结了,byebye as3

1.Flash性能优化引起

Flash和传统的手机OpenGL的有显卡的渲染方式不同(?),所以只能通过以下方式来处理了。(在还不能使用显卡之前都是CPU承担了大部分工作,就算支持显示渲染了,还有兼容性的问题)

  • 传统渲染
    也是用Flash IDE来做的MovieClip ,Shape ,Bitmap,如果不经过其他处理全都addChild()上去,显示对象一多就卡,尤其是动画多,有矢量的时候的时候。(矢量图形:movieClip.cacheAsBitmap = true ,有点像IDE里面的右键矢量图形转换为位图的功能?)
  • 位图化BitmapData渲染
    读取movieclip的所有帧的bitmapData,再用自己来Timer来控制显示形成动画,据说在大量同屏动画时效率非常的高
  • 像移动平台大图的Bit Bliting
    在Flash IDE中支持一种叫做Sprite Sheet导出工具,选中要合成的多个图片,右键生成Sprite Sheet,像不像TexurePacker做的工作???还有Unity3D的支持的压缩???
    生成大图之后就可以对这个BitmapData进行copyPixels或者Draw来渲染了。这两种方式差别在下面
    缺点可能就是太吃内存了
    参见:SpriteSheet精灵动画引擎

这种使用还有以下,还未研究过
1.全局位块传输
2.局部位块传输
3.脏位块传输
4.骨骼动画

2.不同的绘图方式

copyPixels只能简单地将一个矩形区域的像素复制到另一处,但不能实现其他旋转、缩放及颜色变化等操作,因此是更为快速的API。如果想以速度最优但又想使用旋转、缩放等操作,可以先对要复制的图像进行预处理,比如预先生成一个原图像旋转了各种角度的精灵表。

  • BitmapData.draw方式

    如图所示,他不光支持bitmapData,而支持所有的Sprite mc 什么的….
    bitmapData.draw(spritesheet, matrix, colortransform, blendmode, rect);

  • BitmapData.copypixes方式

    只有支持bitmapData了

    bitmapData.copyPixels(spritesheet, spriteRect, new Point())

  • 代码实现

a.BitmapData.draw方式

//Movieclip中有补间动画或者全是位图
mc.gotoAndStop(frame);
rect = mc.getBounds(mc);
bitmapData= new BitmapData(mc.width,mc.height,true,0);
//.draw(mc ....) 是从mc中读取出来位图数据出来,名字为source更好
bitmapData.draw(mc,new Matrix(1,0,0,1,-rect.x,-rect.y));
//加入列表
frameBitmapList.push(bitmapData);

  //或者这样写
  var s:snake = new snake();
  var frame:Array = [];
  var totalFrames:int = s.totalFrames;
  for(var i:int=1; i {
      var bmd:BitmapData = new BitmapData(s.width, s.height);
      s.gotoAndStop(i);
      bmd.draw(s);
      frame.push(bmd);
  }

3.实例对比

下载实例:实例下载

4.其他说明

0.Flash中的Matrix

1.Scaleform

其他网络游戏中有使用Scaleform来做界面,因为他是flash扩展来做 (需要安装Adobe Extension Manager,绿色版本没有的)

2.Flash性能调试工具

  • FDTDebug Profile来显示对象,查看内存等
  • Adoble Scout来观察游戏的内存,CPU占用情况,以及脏矩形
  • 用windows进程查看工具,看内存的CPU消耗情况,这个最接近真实情况

3.Flash地图

一般都是专用的地图编辑器来做,一张地图和可行走区域的XML,这里的xml可以用读取swf的Bitmap来做,红色不可以走,其他的不可以走,刚好可以和地图图片对应起来,还刚好用Flash完成

4.实验时有时透明的飞机有白色的底

本身draw出来的是不带背景的, 你看到的背景白色,是因为bmd是透明的.所以看到下面了. 建议在bmd下面再画一个其他颜色的层,这样就可以看到bmd的透明部分了.

 //这样会透明,但是飞机会有白底
//canvasBD=new BitmapData(400,400);
 //有个底色不透明,上面的飞机就会透明
 canvasBD=new BitmapData(400,400 ,false,0x000000);
 canvasBitmap=new Bitmap(canvasBD);
 addChild(canvasBitmap);
 //哪怕加了有底的BitmapData上去
 canvasBD.copyPixels(backgroundBD,backgroundRect, backgroundPoint);
 canvasBD.copyPixels(tileSheet,heliRect, heliPoint);

5.关于Flash下载资源最好3个loader同时下载的原因:

因为浏览器的限制,最好三个左右进程进行loader下载效率最高,不用下载完一下再下载另一个:http://www.zhihu.com/question/20474326

5。疑问与特学习:

  • 卡马克卷轴算法

参考:

  1. MMOARPG的位图优化性能展示: http://bbs.9ria.com/thread-60130-1-1.html
  2. Flash应用效率优化启示录(渲染篇) http://www.iamsevent.com/post/46.html
  3. Flash优化,追求速度的渲染:http://blog.dreamana.com/2011/10/06/render-for-speed/
  4. 再谈cacheAsBitmap http://www.daimami.com/web/272011.htm
  5. Bit Bliting 有很绚的例子:http://www.yopsolo.fr/wp/2012/11/08/tutorial-blitting/
  6. 位图渲染角色动画的实现方法的性能差异 http://bbs.9ria.com/thread-77376-1-1.html