如何提高你的移动开发中AS3/AIR性能
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并设置:
- <initialWindow> <renderMode>gpu</renderMode> </initialWindow>
复制代码
步骤二:降低舞台渲染质量
AS3舞台渲染质量相对决定了你能渲染的图片多少。不过重点是,即使你设置了舞台渲染质量为低,bitmap的平滑(smoothing)属性仍然有效并且在表现上没多大区别。如此一来我们就没必要浪费CPU在这个地方了。
- stage.quality = LOW;
复制代码
如果你的图片正在加载并想在运行中切换渲染模式(见步骤三),AS3可以允许你运行中改变,像这样:
- stage.quality = HIGH;
- convertMySprite(); // 处理函数
- 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性能的更多相关文章
- 关于Net开发中一些SQLServer性能优化的建议
一. ExecuteNonQuery和ExecuteScalar 对数据的更新不需要返回结果集,建议使用ExecuteNonQuery.由于不返回结果集可省掉网络数据传输.它仅仅返回受影响的行数.如果 ...
- Android 开发中三种多线程
在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各 ...
- ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中
如果解决ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中 手机平台性能是个关键问题. 压缩视频分成3个步骤: 读取显卡数据, 使用编码器压缩,保存文件. 使用libav 压缩的 ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- 分享20款移动开发中很有用的 jQuery 插件
今天,很显然每个网站都需要有一个移动优化的界面以提高移动用户的使用体验.在开发任何移动项目时,要尽可能保持每一种资源尺寸都尽可能的小,以给最终用户提供一个好的体验是非常重要的.在这篇文章中我们已经编制 ...
- iOS 开发中的争议(一)
序言 打算分享一些有争议的话题,并且表达一下我的看法.这是该系列的第一篇,我想讨论的是:类的成员变量应该如何定义? 在 Objective-C 的语言的早期,类的私有成员变量是只能定义在 .h 的头文 ...
- 【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识
自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书写速度. 下面我们就来一起学习一下Cocos ...
- PHP开发中的缓存技术汇总
在PHP开发中,出于对网站服务器负载的考虑,往往需要对页面.数据等内容进行缓存处理,下面就来看看,在PHP开发中有哪些缓存方式吧. 1.页面部分缓存该种方式,是将一个页面中不经常变的部分进行静态缓存, ...
- android-webview开发中的各种使用方法(持续更,尽量全)
最新坑A:(没看过的可以从下面开始处看起): 测试部门测出来一个坑,当多次点击退出后,会出现app崩溃现象,报如下错误: java.lang.IllegalArgumentException: Rec ...
随机推荐
- 201871010123-吴丽丽《面向对象程序设计(Java)》第十一周学习总结
201871010123-吴丽丽<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- Linux sh、source和.命令执行.sh文件的区别
sh文件介绍 .sh为Linux的脚本文件,我们可以通过.sh执行一些命令,可以理解为windows的.bat批处理文件. 点命令 .命令和source是同一个命令,可以理解为source的缩写,简称 ...
- git npm包管理
#Node # node 一.安装nodejs 下载地址:http://nodejs.cn/download/ 二.安装git 下载地址:https://git-scm.com/download/wi ...
- JAVA还没死的原因
尽管 TIOBE 指数显示,Java 是一门正在衰落的语言,但它仍然稳居榜首.从 2016 年到 2017 年间,这个数字可能会大幅下降,但最近下降速度有所放缓:在 2018 年 10 月到 2019 ...
- [LeetCode] 8. String to Integer (atoi) 字符串转为整数
Implement atoi which converts a string to an integer. The function first discards as many whitespace ...
- CSP-S考前救急(考试前还是别复习了,事实证明复习了也没考到...
“不要为明天而忧虑,因为明天自有明天的忧虑:一天的难处一天当就够了.” 念念不忘,必有回响. 考试结束前15分钟停止写代码.然后按照以下顺序进行检查: -检查文件名是否写错-检查是否打开文件输入输出 ...
- LeetcCode 27:移除元素 Remove Element(python、java)
公众号:爱写bug 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) ...
- kafka压测
原文并未提及kafka的版本 并且测试的消息大小都偏小 测试数据供参考 原文还测试了broker等 原文请移步文章末尾 4.1 producer测试 4.1.1 batch-size 测试结果 ...
- Java ReentrantLock中tryLock与lock的区别(非公平锁与公平锁)
设置同步状态,利用CAS操作. // CAS操作:如果当前状态值等于期望值,则自动将同步状态设置为给定的更新值 protected final boolean compareAndSetState(i ...
- 前端图片canvas,file,blob,DataURL等格式转换
将file转化成base64 方法一:利用URL.createObjectURL() <!DOCTYPE html> <html> <head> <title ...