Shawn Blais 让我了解到如何在移动平台上对AS3代码进行优化。他的博客(http://esdot.ca/site/category/blog)只有十来篇文章,但都是些很意思的信息,尤其适合我。这篇文章介绍的是关于图形方面的优化。
      下面三个步骤可以提高程序的性能,其实都围绕一个理论:一切皆bitmap。 或许你可以使用MovieClips 或者 Sprite序列动画,甚至可以继续保持使用Flash的渲染列表来保持代码简单整洁。但真正的图片数据是? Bitmap!一切皆bitmap。

步骤一: 使用GPU渲染
       当你创建一个移动程序的时候,你会找到一个包含所有基本程序设定的文件,叫"application.xml"(或者类似的名字)。其中有一段代码会告诉移动设备使用CPU还是GPU渲染。大多默认(如FlashDevelop模版程序)会启用CPU渲染,这可能比较合适于矢量图渲染。但使用bitmap并启动GPU渲染将会使性能大大提高!
打开application.xml并设置:

  1. <initialWindow> <renderMode>gpu</renderMode> </initialWindow>

复制代码

步骤二:降低舞台渲染质量
        AS3舞台渲染质量相对决定了你能渲染的图片多少。不过重点是,即使你设置了舞台渲染质量为低,bitmap的平滑(smoothing)属性仍然有效并且在表现上没多大区别。如此一来我们就没必要浪费CPU在这个地方了。

  1. stage.quality = LOW;

复制代码

如果你的图片正在加载并想在运行中切换渲染模式(见步骤三),AS3可以允许你运行中改变,像这样:

  1. stage.quality = HIGH;
  2. convertMySprite(); // 处理函数
  3. stage.quality = LOW;

复制代码

步骤三: 使用Bitmaps,并缓存它们
       这可能是最好的优化方式,我的移动程序都应用上了这种方法。不过只有使用GPU渲染才能达到最佳效果。基本理念就是把全部的bitmap data 缓存到Dictionary里面供之后引用。在GPU渲染模式下,这些纹理数据保存在GPU存储器中。只要是从Dictionary获取的图片资源都是引用唯一的一份bitmapData,不用耗费新的内存并且创建新的图片速度非常快!
       这种方式特别适合频繁使用的图片,如--提示,小怪,子弹和地图块等。不过我是全部都用上了。
       如果你还想了解更多的细节,Shawn的研究报告有源码和详细的解析。他的代码帮你做了很多自动化的底层,并又由很多人去完善了代码。我自己也做了细微的调整,现在只要一个类我就可以使用任何我想要的图片资源。导入.PNG文件? 包含Sprite或MovieClip的.SWC?自己定制配置文件? 都不需要!!全自动底层实现~,轻快,使用简单。而且最酷的是:代码非常简短,而且简单易懂。
       说的有点多了,下面是我现在用的类的链接(http://www.andymoore.ca/code/CachedSprite.as)。完全免费使用,最好让我知道你导入了我这个类 。复制粘帖到工程上面就可以马上应用它了。

额外步骤:转换MovieCilps
      我还没试过这一步骤,不过这算是步骤三里的拓展吧。一个工具类(http://esdot.ca/site/2012/fast-rendering-in-air-cached-spritesheets)把MovieClip里面的每一帧都转化为bitmap data缓存(存储到GPU)。如果我最近手头上的游戏有需要动画的话,我将都会用上这个。

缺点
       我发现使用GPU渲染的最大弊端就是你会失去一些实时的filters和blendmodes的表现力。比如你想要一个漂亮的火焰发光效果的时候,预置效果当然很容易。但是如果你想动态添加一些效果--如添加一些风力效果和文字,那是很难达到满意的效果(使用设备字体,基于spritesheet的渲染)。如果你也有类似的难题可以来与我商讨,我会找到解决方案的(但不一定都能解决)。
       其次就是深层嵌套的渲染列表会比平时更降低你App的性能。尽量避免过深的渲染嵌套。不过我觉得你已经这样做了
       GPU渲染在非移动平台上并不一定运行结果一样(不包括Stage3D的官方例子)。这意味着当你在电脑中测试运行你的移动app的时候你仍然可以看到filters和blendmodes的效果(在手机上不一定有)。这会导致一些混乱,特别是一个复杂的app程序在桌面上运行的时候。

优点
       使用我的方法即时是很复杂的游戏场景在用了2年的Nexus手机上依然可以跑的很流畅。我还在iPad上做了1个多小时的性能测试-不断地绘制新的动画(并且不移除它们)。测试最后降到了3FPS并且内存增长正常,app程序也没崩溃。
       最关键的是,在手机设备上这样的性能提升比用blitting要好的多。这意味着基于这3个步骤下来你将获得比Flixel 和FlashPunk 默认渲染引擎更好的性能。
       在大多情况下,在移动设备上由于使用GPU,可能要比电脑上运行起来性能更好。 希望Stage3D会做一些改良,那到时候blitting引擎(如 Flixel和 FlashPunk)可能会比较适合桌面和浏览器平台。

更多图表,数据和测试报告,详情请查看Shawn的帖子,他认为移动性能提升能达到4000%。

博客内容来源:http://bbs.9ria.com/thread-174891-1-1.html

原文链接:http://www.andymoore.ca/2012/01/how-to-improve-your-mobile-as3air-performance/

如何提高你的移动开发中AS3/AIR性能的更多相关文章

  1. 关于Net开发中一些SQLServer性能优化的建议

    一. ExecuteNonQuery和ExecuteScalar 对数据的更新不需要返回结果集,建议使用ExecuteNonQuery.由于不返回结果集可省掉网络数据传输.它仅仅返回受影响的行数.如果 ...

  2. Android 开发中三种多线程

    在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各 ...

  3. ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中

    如果解决ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中 手机平台性能是个关键问题. 压缩视频分成3个步骤: 读取显卡数据, 使用编码器压缩,保存文件. 使用libav 压缩的 ...

  4. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  5. 分享20款移动开发中很有用的 jQuery 插件

    今天,很显然每个网站都需要有一个移动优化的界面以提高移动用户的使用体验.在开发任何移动项目时,要尽可能保持每一种资源尺寸都尽可能的小,以给最终用户提供一个好的体验是非常重要的.在这篇文章中我们已经编制 ...

  6. iOS 开发中的争议(一)

    序言 打算分享一些有争议的话题,并且表达一下我的看法.这是该系列的第一篇,我想讨论的是:类的成员变量应该如何定义? 在 Objective-C 的语言的早期,类的私有成员变量是只能定义在 .h 的头文 ...

  7. 【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识

    自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书写速度. 下面我们就来一起学习一下Cocos ...

  8. PHP开发中的缓存技术汇总

    在PHP开发中,出于对网站服务器负载的考虑,往往需要对页面.数据等内容进行缓存处理,下面就来看看,在PHP开发中有哪些缓存方式吧. 1.页面部分缓存该种方式,是将一个页面中不经常变的部分进行静态缓存, ...

  9. android-webview开发中的各种使用方法(持续更,尽量全)

    最新坑A:(没看过的可以从下面开始处看起): 测试部门测出来一个坑,当多次点击退出后,会出现app崩溃现象,报如下错误: java.lang.IllegalArgumentException: Rec ...

随机推荐

  1. IDEA优秀插件分享之---Mybatis Log Plugin

    小伙伴们在使用mybatis的时候有时候会出现一些sql异常,这个时候就需要对执行的sql语句进行检查.然而mybatis一般使用log4j打印执行的sql语句,类型下面这种的: 这个时候如果sql语 ...

  2. 201871010110-李华《面向对象程序设计(java)》第十五周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  3. SLAM:

    十四讲: 传感器约束了外部环境 测到的通常都是一些间接的物理量而不是直接的位置数据 只能通过一些间接的手段,从这些数据推算自己的位置 好处是没有对环境提出任何要求 camera:单目.双目.深度 Mo ...

  4. JDOJ 1770 埃及分数

    JDOJ 1770: 埃及分数 https://neooj.com/oldoj/problem.php?id=1770 Description 分子均为1的分数叫做埃及分数,因为古代埃及人在进行分数运 ...

  5. LG2045 方格取数加强版 费用流

    问题描述 LG2045 题解 费用流. 套路拆点,把\((i,j)\)拆为两个点,在这两个点之间连边:一条边流量为\(1\),费用为\(a_{i,j}\),另一条边为流量为\(INF\),费用为\(0 ...

  6. 【java】获取昨天/今天/明天日期

    昨天: SimpleDateFormat sdf=new SimpleDateFormat("yyyMMdd"); Calendar calendar = new Gregoria ...

  7. 【ECNU3386】Hunter's Apprentice(多边形有向面积)

    点此看题面 大致题意: 按顺序给你一个多边形的全部顶点,让你判断是按顺时针还是逆时针给出的. 多边形有向面积 显然我们知道,叉积可以求出两个向量之间有向面积的两倍. 所以,我们三角剖分,就可以求出四边 ...

  8. luogu P2221 [HAOI2012]高速公路题解

    题面 很套路的拆式子然后线段树上维护区间和的题.一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式. 考虑一次询问[l,r]的答案怎么算: ...

  9. [ZJOI2019]线段树(线段树,DP)

    又是神仙题. 要写博客太长了,先咕着.放个代码先. 为什么 fmul 在 linux 底下还被定义过了--能想象到我一发 CE 的绝望吗 qaq #include<bits/stdc++.h&g ...

  10. [LeetCode] 279. Perfect Squares 完全平方数

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...