谨以此文对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.实例对比
- 直接copyPixes来显示 比 把copyPiexes完的BitmapData放在放数组里,再bitmapData = bitmapdata要快,可能这个数组占了太大的内存了! 来源自:http://bbs.9ria.com/forum.php?mod=redirect&goto=findpost&ptid=77376&pid=723368&fromuid=392389
下载实例:实例下载
4.其他说明
0.Flash中的Matrix
1.Scaleform
其他网络游戏中有使用Scaleform
来做界面,因为他是flash扩展来做 (需要安装Adobe Extension Manager
,绿色版本没有的)
2.Flash性能调试工具
- 用
FDT
的Debug 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。疑问与特学习:
- 脏矩形这个例子中:背景图如果不动的话,完全可以不用每次都CopyPixels???这算脏矩形?:http://bbs.9ria.com/thread-96717-1-1.html
- 卡马克卷轴算法
参考:
- MMOARPG的位图优化性能展示: http://bbs.9ria.com/thread-60130-1-1.html
- Flash应用效率优化启示录(渲染篇) http://www.iamsevent.com/post/46.html
- Flash优化,追求速度的渲染:http://blog.dreamana.com/2011/10/06/render-for-speed/
- 再谈cacheAsBitmap http://www.daimami.com/web/272011.htm
- Bit Bliting 有很绚的例子:http://www.yopsolo.fr/wp/2012/11/08/tutorial-blitting/
- 位图渲染角色动画的实现方法的性能差异 http://bbs.9ria.com/thread-77376-1-1.html