除了渲染vector之外,AS3中的主要性能击球手是什么?
在ActionScript 3中,使用vectorgraphics是对项目性能造成巨大损害的保证方式。
通过使用.copyPixels()
通过其BitmapData
对象代替所有vectorgraphics,对所有graphics使用单个Bitmap
将产生可笑的性能提升,并且对于像我自己在Flash中开发游戏的人员是必不可less的。
除此之外,我不太确定下一个我应该瞄准和试图优化的主要事情是什么。 我确实使用了很多内置的三angular函数,但它们似乎并没有影响那么多。 我知道有一些图书馆用近似方法和类似的方法来优化math,但到目前为止我还没有发现这些必要的。
还有其他大量的已知点,我应该看看? 我更多的是指内置的东西,我应该小心(如避免向量渲染),而不是如何提高自己的编码风格。
我发现有用的文件是:
- 优化Adobe Flash平台的性能
- Gary Grossman编写的ActionScript 3.0和AVM2性能调优
- 构build高性能iPhone应用程序Mike Chambers
一些亮点:
select适当的显示对象
限制内存使用的最简单的优化技巧之一是使用适当types的显示对象 。 对于不具有交互性的简单形状,请使用Shape对象。 对于不需要时间轴的交互式对象 ,请使用Sprite对象。 对于使用时间轴的animation,请使用MovieClip对象。
使用getSize()
来testing代码
getSize()
返回指定对象的内存大小。
select适当的原始types来节省内存
除string以外的所有基本types在内存中使用4 – 8个字节。 如果未指定值,则表示64位值的数字由ActionScript虚拟机(AVM)分配8个字节。 stringtypes的行为不同。 基准代码,并确定任务的最有效的对象。
重用对象
通过重用对象来优化内存,并尽可能避免重新创build内存。
使用对象池
重新使用对象减less了实例化对象的需要,这可能是昂贵的。 这也减less了垃圾收集器运行的机会,这可能会减慢你的应用程序。
自由的记忆
为了确保垃圾收集对象,删除对象的所有引用。 内存分配,而不是对象删除,触发垃圾收集。 尝试通过尽可能多地重用对象来限制垃圾收集。 此外,尽可能将引用设置为null,以便垃圾回收器花费较less的处理时间来查找对象。 把垃圾收集看作保险,并且在可能的时候总是明确地pipe理对象的生命周期。
将对显示对象的引用设置为null不能确保对象被冻结。 对象继续消耗CPU周期,直到垃圾收集。
BitmapData类包含一个
dispose()
方法,尽pipedispose方法从内存中删除像素,但引用仍然必须设置为null才能完全释放。
使用位图
使用vector,尤其是大数量的vector显着增加了对CPU或GPU资源的需求。 使用位图是优化渲染的好方法,因为运行时需要更less的处理资源来绘制屏幕上的像素而不是渲染vector内容。
避免filter,包括通过Pixel Bender处理的filter
将filter应用于显示对象时,运行时会在内存中创build两个位图。 使用外部编写的位图有助于运行时减lessCPU或GPU负载。
使用mipmapping来缩放大图像
谨慎使用mipmap。 虽然它提高了缩小的位图的质量,但它对带宽,内存和速度都有影响。
将文本引擎用于只读文本,将文本TextField
用于input文本
对于只读文本,最好使用Flash文本引擎 ,它提供低内存使用率和更好的渲染。 对于input文本, TextField对象是更好的select,因为需要更less的ActionScript代码来创build典型的行为,如input处理和自动换行。
使用callback而不是事件
与使用传统的callback函数相比,使用本机事件模型可能会更慢并消耗更多的内存。 事件对象必须在内存中创build和分配,这会导致性能下降。 例如,在侦听
Event.ENTER_FRAME
事件时,会在事件处理程序的每个帧上创build一个新的事件对象。 由于捕捉和冒泡阶段,显示对象的性能可能会特别慢,如果显示列表很复杂,这可能是昂贵的。
冻结和解冻对象添加/从舞台上删除
即使显示对象不再在显示列表中,并且正在等待垃圾收集,他们仍然可以使用CPU密集型代码。
使用Loader类加载远程内容时,冻结的概念也很重要。
unloadAndStop()
方法允许您卸载SWF文件,自动冻结加载的SWF文件中的每个对象,并强制垃圾收集器运行。
使用Event.ACTIVATE
和Event.DEACTIVATE
事件来检测背景不活动
Event.ACTIVATE
和Event.DEACTIVATE
事件允许您检测运行时何时获得或失去焦点。 因此,可以优化代码以对上下文更改作出反应。激活和停用事件允许您实现类似的机制,以便在移动设备和上网本上find“暂停和恢复”function。
尽可能禁用鼠标交互
在屏幕上显示许多交互式对象时,检测鼠标交互可能会占用CPU资源,尤其是在重叠的情况下。 如果可能,请考虑禁用鼠标交互,这有助于您的应用程序使用较less的CPU处理,从而减less移动设备上的电池使用量。
对非animation内容使用计时器
对于长时间执行的非animation内容,定时器优先于
Event.ENTER_FRAME
事件。计时器的行为方式与
Event.ENTER_FRAME
事件类似,但可以调度事件而不受帧速率限制。 这种行为可以提供一些重要的优化。 以一个video播放器应用程序为例。 在这种情况下,您不需要使用高帧速率,因为只有应用程序控件正在移动。
限制补间
限制补间的使用,这可以节省CPU处理,内存和电池使用时间,从而帮助低层设备上的内容更快地运行。
使用Vector
与Array
Vector 类比Array类允许更快的读写访问。
使用Vector实例时的数组元素访问和迭代比使用Array时快得多。
在严格模式下,编译器可以识别数据types错误。
运行时间范围检查(或固定长度检查)可显着提高arrays的可靠性。
使用绘图API更快的代码执行
使用
drawGraphicsData()
drawPath()
,drawGraphicsData()
,drawTriangles()
减less代码执行量更less的代码行可以提供更好的ActionScript执行性能。
使用事件捕获和冒泡来最小化事件处理程序
利用事件的冒泡可以帮助您优化ActionScript代码执行时间。 您可以在一个对象上注册一个事件处理程序,而不是多个对象,以提高性能。
使用setVector()
方法绘制像素
绘制像素时,只需使用BitmapData类的适当方法即可进行一些简单的优化。 快速绘制像素的方法是使用
setVector()
方法。
当使用像setPixel()
或setPixel32()
这样的慢方法时, lock()
和unlock()
BitmapData
调用
lock()
和unlock()
可以防止不必要地更新屏幕。 迭代像素的方法getPixel()
如getPixel()
,getPixel32()
,setPixel()
和setPixel32()
可能会很慢,特别是在移动设备上。 如果可能的话,使用在一次调用中检索所有像素的方法。 为了读取像素,使用比getPixels()
方法更快的getPixels()
方法。 此外,请记住尽可能使用依赖于Vector对象的API,因为它们可能运行得更快。
使用String
类方法而不是正则expression式
当一个String类的方法可用时,它的运行速度比等效的正则expression式快,并且不需要创build另一个对象。
对于TextFields,请使用apendText()
而不是+=
运算符
使用
appendText()
方法可以提高性能。
方括号运算符[]
可能会降低性能 – 在局部variables中存储引用
使用方括号操作可能会降低性能。 您可以通过将您的引用存储在局部variables中来避免使用它。
通过内联移动代码来减less函数调用次数
调用函数可能很昂贵。 尝试通过内联移动代码来减less函数调用次数。
内联移动函数调用会使代码速度提高四倍以上。
避免将内容放置在舞台之外
即使离屏元素没有在屏幕上显示,也没有渲染,它们仍然存在于显示列表中。 运行时继续运行这些元素的内部testing,以确保它们仍处于离台状态,并且用户没有与它们进行交互。
避免使用alpha
属性
当显示对象使用alpha混合时,运行时必须将每个堆叠显示对象的颜色值与背景颜色组合起来以确定最终颜色。 因此,与绘制不透明颜色相比,阿尔法混合可能需要更多的处理器处理。 这种额外的计算可能会影响慢速设备的性能。
使用尽可能低的帧频
较高的帧速率会比较低的速率消耗更多的CPU周期和电池能量。
运行时代码执行基础
使用位图caching来处理复杂的vector内容
此functioncachingvector对象,将其呈现为位图内部,并使用该位图进行渲染。 如果高速caching的内容在每一帧上不旋转,缩放或更改,则位图caching可改善渲染效果。 除x和y轴上的平移之外的任何转换都不会改进。
在移动AIR应用程序中使用caching的位图时,请设置cacheAsBitmapMatrix
属性
AIR移动configuration文件中的
cacheAsBitmapMatrix
可以将任何二维转换应用到对象,而无需重新生成caching的位图。 您也可以更改alpha属性而不重新生成caching的位图。
使用BitmapData
类来创build自定义位图caching行为
在内存中只使用一个caching的位图,并由所有实例共享。
在单个处理程序中隔离Event.ENTER_FRAME
等事件
这种技术可以节省CPU资源。
使用位图cachingfunction和opaqueBackground
属性来提高文本呈现性能
位图cachingfunction允许您将vector内容caching为位图,以提高渲染性能。 此function对于复杂的vector内容很有帮助,而且与需要处理的文本内容一起使用时也很有用。
绘制透明位图图像时,Alpha透明度会给运行时带来额外的负担。 您可以使用
opaqueBackground
属性绕过该属性,方法是将颜色指定为背景。
启用GPU硬件graphics加速
为了将Flash内容的GPU加速与AIR用于移动平台,Adobebuild议您使用renderMode =“direct” (即Stage3D)而不是renderMode =“gpu”。 Adobe正式支持并推荐以下基于Stage3D的框架: Starling(2D)和Away3D(3D) 。
避免在HTMLembedded参数中使用wmode = transparent或wmode = opaque 。 这些模式可能会导致性能下降。 在软件和硬件渲染中,它们也可能导致audio – video同步的小损失。 此外,当这些模式生效时,许多平台不支持GPU渲染,严重影响性能。
青睐使用asynchronous版本的操作
当前执行线程中的应用程序代码继续执行。
asynchronous操作被安排和划分以避免渲染问题。 因此,使用asynchronous操作版本的响应式应用程序要容易得多。 有关更多信息,请参阅感知性能与实际性能比较。
光滑的形状,以提高渲染
与位图不同,渲染vector内容需要许多计算,特别是对于包含许多控制点的梯度和复杂path。 作为devise师或开发人员,确保形状已经足够优化。
在加载它们之后在本地caching资产,而不是在每次需要时从networking加载它们
如果您的应用程序加载资源(如介质或数据),请通过将资源保存到本地设备来caching资源。 对于不经常更改的资产,请考虑定期更新caching。
使用StageVideo
类来利用硬件加速
使用StageVideo类来利用硬件加速来呈现video。
这种方法充分利用了底层的video硬件。 其结果是在CPU上的负载要低得多,这转换成在较不强大的设备上更高的帧速率以及更less的内存使用。
AACaudio格式以相同的比特率提供比mp3格式更好的质量和更小的文件大小
与video解码类似,audio解码需要较高的CPU周期,并可通过利用设备上的可用硬件来优化。
AAC格式比同等比特率的mp3格式提供更好的质量和更小的文件大小。
最小化构造函数中的代码
如构造函数的初始化函数被解释,其他的一切都是JIT。