如何提高你的移动开发中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 ...
随机推荐
- html基础内容
HTML基础 1. HTML 标题 HTML 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. 2. HTML 段落 HTML 段落是通过 <p& ...
- matlab的clc,close,close all,clear,clear all命令
clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响 close:关闭当前的Figure窗口 close all:关闭所有的Figure窗口 clear:清除工作空间的所有变量 clear a ...
- Autofac注册组件详解
注册概念:我们通过创建 ContainerBuilder 来注册 组件 并且告诉容器哪些 组件 暴露了哪些 服务.组件 可以通过 反射 创建; 通过提供现成的 实例创建; 或者通过 lambda 表达 ...
- Tableau可视化操作
1.地图显示 1.修改地理角色:“省份” 2.双击省份—绘制地图 3.显示销售额和利润额的情况—销售额(大小)+利润额(颜色) 4.修改显示颜色:两种方式 第一种方式:双击右边利润额图例— 第二种方式 ...
- 解决js 0.1 + 0.2 = 0.30000000000000004 的位数精度问题
https://www.html.cn/archives/7340 解决办法 parseFloat((0.1 + 0.2).toFixed(10))
- requests--文件上传,文件下载
文件上传 在做接口自动化的时候,有时需要上传文件,比如更改头像等等,在request里,通过files参数来上传 import requests base_url = 'http://httpbin. ...
- 洛谷p1137旅行计划
题面 关于拓扑排序 因为这好几次考试的题目里都有在DAG中拓扑排序求最长/短路 txt说它非常的好用 就找了个题做了下 拓扑排序就是寻找图中所有的入度为零的点把他入队 然后再枚举它所有的连到的点,只要 ...
- Appium入门指南 - 环境搭建和Case编写
本文档将详细介绍如何搭建 Appium 的运行环境,以及如何编写一个简单的 UI 自动化测试用例.其中,也会穿插讲解一些 Appium 的基本知识.关于 Appium 的更多信息,大家可以查看官方文档 ...
- [LeetCode] 31. Next Permutation 下一个排列
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- json data转匿名对象C#
using Newtonsoft.Json.Linq; 代码如下: static void Main(string[] args) { Console.WriteLine("Test 4.8 ...