zoukankan      html  css  js  c++  java
  • 演义群侠传(二)【移动游戏性能优化】

    工具:

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

  • 相关阅读:
    arguments.callee
    vue的生命周期
    Vue中的v-cloak用法
    控制input只能输入数字和两位小数
    css3新单位vw、vh的使用详解
    关于图片的Base64编码
    Logic and Fault simulation
    scan design flow(二)
    scan design flow(一)
    异构计算
  • 原文地址:https://www.cnblogs.com/tinytiny/p/2815005.html
Copyright © 2011-2022 走看看