演义群侠传(二)【移动游戏性能优化】
工具:
Flash CS5 Professional
FB4
adobe device central
AIR for Android FlashCS5扩展(为AIR应用准备)
客户端:
flash player 10.1
air for android(通过pre-release申请的开发者)
FP10.1新的API:
help.adobe.com
新功能:
1多点触摸、手势(不支持android)
2重力测量器
3屏幕导向
4移动设备文字输入
5全球化(gslib)
6global error handling
7优化swf管理,通过html参数haspriority来指定价在swf优先级
8睡眠模式
安全模型变化:
1、重定向截断:
加载swf、image、audio文件时as可能看不到被加载文件的url
有三种情况:
读取文件时发生http跳转
加载文件domain与调用逻辑文件domain不一样(跨域加载)
调用逻辑文件没有权限访问被加载文件
影响as3代码文件中试图访问loaderinfo.url、sound.url的属性该影响对于手机swf跨域加载内容尤为突出
解决办法:
测试fq10.1的swf文件
确认allowdomain方法的使用
2、for-in和for-each循环顺序
循环改变的条件
循环的object对象同时包含两种类型属性即简单类型和复杂类型是fp10.1将会优先循环object的所有简单类型属性,其次是复杂类型
解决方案:
对于很多复杂类型的游戏的array object的循环遍历逻辑有一定影响;
移植前先在fp10.1上测试
3、loadercontext.allowcodeimport
控制是否允许加载未经信任的swf文件
屏幕尺寸与分辨率:
大部分手机均接近200ppi,电脑是100ppi,这个区别影响分辨率精度
iphone:480*320
nexus one:800*480,252ppi
应用架构——布局:
针对设备动态调整分辨率和ppi
按钮应变的更大
场景尺寸定义:
this.stage.scalemode=stagescalemode.No_scale关闭自动调整布局,由开发者控制
this.stage.align=stagealign.top_left
场景指派事件侦听(应用初始化、窗口缩放、设备放置)
this.stage.addeventlistener(event.resize,dolayout)
常用Capabilities.screenDPI属性,根据DPI决定显示属性
应用架构——浏览方式:
手势、触摸屏
screen(电脑屏)和surface(手机屏)的区分:后者带来更多的同屏直接交互
stage之外的内容将优先被gabage collect掉
应用开发——移动特殊交互方式:
为触摸、滑动等独特操作进行设计
让应用场景尽可能充满屏幕
移动设备屏幕小、用户专注的应用面积越大越好、视频和游戏尽可能全屏工作
应用开发——优化建议:
(算法:汉诺塔、图search、二叉树、图形搜索)
设定好应用的framerate属性,谨慎向enterframe添加逻辑,谨慎使用updateafterevent事件属性(因为手机的处理能力会使这种操作导致运行速度变慢)
选择正确的display object:
shape占用236字节内存
sprite412字节
MC440字节
无交互的形状显示用shape,无时间轴有交互显示用sprite,最后用MC
及时给原始类型变量赋值
var a:number;getsize(a);->占用8字节内存
var a:number=1;getsize(a);->4字节
给字符串赋值
var str:string;getsize(str);//4字节
var str:string="";getsize(str);//24字节
应用开发——优化建议:
尽可能重用object,避免重新创建object
(见图片)
应用开发——优化建议:
用代码鼓励FP触发回收机制
确认一个对象会被GC:
删除对该对象的应用
var mysprite:sprite=new sprite()
mysprite=null
垃圾回收不会马上执行,只有在人为内存资源紧张时才会执行;
大型应用中,频繁GC会导致性能降低
明确删除对象引用,将会降低垃圾回收机制对性能的消耗
确认删除对象引用时,需要确认删除所有该引用上的侦听器
removeEventListener()
BitmapData.dispose()会立即从内存中释放BitmapData的image资源
FP10.1和AIR1.5.2+版本可以铜鼓odisposeXML方法对XML对象立即调用GC
应用开发——优化建议:
用矢量图代替位图降低内存消耗,但会加重cpu负担
降低内存的改进
屏幕是16bits是fp会自动将32bits不透明位图编程16bits位图
重用bimapdata类的实例
fp10.1新功能:自动重用bitmap类
减少flash滤镜和pixel Bender滤镜的使用
替代方法:先用PS与处理好滤镜效果
应用开发——优化建议:
as代码多少决定执行速度。越多虚拟机验证和jit编译的工作多、时间长
避免使用:
flex3和4的框架(可关注flex下一代框架,如hero)
tlfkuangjia
papervision3D等第三方大型as功能库(Away3D有Lite版)
遍历数组时,避免每次循环都遍历检测数组长度
不好的代码:for(vari:int=0;i<myarray.length;i++){}
好的代码:var myarrlength:int=myarray.length
for(vari:int=0;i<myarrlength;i++){}
应用开发——优化建议:
尽可能在一个对象上注册事件侦听。如在容器上注册事件侦听,通过冒泡捕获机制(evt.stoppropagation)来得到是哪个具体对象。
3D 效果谨慎使用:占用过多内存
文本:只读文字用flash.text.engine(FTE)、输入文本尽可能用textfield类、对于textfield对象不要使用+=运算符,而使用appendtext()方法
动画补间:限制补间动画使用次数
vector类效率高于array类(参见参考文档)
快速绘制像素:可以考虑使用setvector(),效率高于setPixel(),必须用后者则考虑锁住bitmapdata对象,放置引用bitmapdata的bitmap频繁更新;使用lock()和unlock()进行屏幕刷新控制
遍历像素的setpixel()、setpixel32()、getpixel()、getpixel32()方法均可能造成动画速度慢
应用开发——优化建议:
Alpha混合太占CPU
手机PPI较高,所有内容质量设定不用太高在手机上已经很好,stagequality.MEDIUM为最好
帧速设定:
flex不用管,flex自动管;
动画,20fps。视频与动画帧速设置无关,会按照视频的默认帧速播放
无动画,仅交互组件,12fps
应用程序静止状态,5fps
最小化,2fps
动态设定帧速是个好方法,stage.frameRate和windowedApplication.frameRate
位图缓存是双刃剑,提高性能的同时占用大量内存:
Sprite对象打开位图缓存、移动、修改坐标均不会刷新缓存,旋转、缩放和alpha设定均重新刷新位图缓存,降低性能
动画内容使用滤镜,在移动设备上播放不是好方式
FP隐藏规则:放在Stage之外的未使用显示对象,会优先释放其占用的内存资源
应用开发——优化建议:
FP10.1中尚未对移动设备开放GPU加速,不能强制打开GPU加速
Wmode=gpu已经失去意义
wmode=opaque或transparent为禁用GPU加速
应用开发——优化建议:
在创建flash动画内容的矢量素材时:
预先优化矢量内容,查看边缘曲线控制点,减少之,减少最终swf大小
发布项目:不要使用bin-debug目录中的swf文件,通过exportrelease方式发布体积更小的版本
应用开发——节省cpu使用量的新功能:
睡眠模式:根据背景光检测、stage.framerate=4fps
非活动状态:
swf内容降到2fps
用户滚动页面,导致内容移动到屏幕外,内容继续播放,显示暂停
浏览器选项卡变更,swf内容不在当前选项卡页面上显示,进入非活动状态。
屏幕上,确保播放或as3的执行不会暂停,hasPriority=true
将等待垃圾回收不在显示列表的显示对象处理掉:
event.Remoed_from_stage
event.added_to_stage
使用unloadandstop()方式,处理冻结并强制运行垃圾回收过程
在整个开发周期过程中,时刻使用重绘区域选项:
重回区域将表示出显示列表中的活动区域(包括不可见区域)
flash.profiler.showRedrawRegions(true,0x0000FF)
其它开发资源:
memory monitoring componet
第三方stats和performancetest类
flashbuilder4Profiler工具和flexPMD工具监察内存占用
AIR2.x和FP10.1的不同:
前者包含后者
FP10.1针对浏览器插件、AIR2针对独立应用
AIR2在PC和Android上有超越浏览器的功能支持:
增强的应用安全模型(Rsa 128bits签名)
操作本地数据存储(Android暂不支持AES Sqlite128bits功能)
离线在线混合操作
GPS检测
AIR for Android应用创作:
Flash CS5做的AIR可在Android上运行,只需更改发布打包选项
目前Android上不能或限制使用的FlashRuntimeAPI:
RTMPE
PixelBenderFilters
DRM
Encrypted Local Store
使用Flash创作AIR for Android应用支持哪些Android系统功能:
多点触摸
屏幕导向
存储图片到相册库
重力检测
地理位置
剪切、拷贝、粘贴