• 演义群侠传(二)【移动游戏性能优化】


    工具:

    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系统功能:
            多点触摸
            屏幕导向
            存储图片到相册库
            重力检测
            地理位置
            剪切、拷贝、粘贴

  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/tinytiny/p/2815005.html
Copyright © 2020-2023  润新知