除了渲染向量之外,AS3 中的主要性能影响因素是啥?

Posted

技术标签:

【中文标题】除了渲染向量之外,AS3 中的主要性能影响因素是啥?【英文标题】:What are the major performance hitters in AS3 aside from rendering vectors?除了渲染向量之外,AS3 中的主要性能影响因素是什么? 【发布时间】:2012-01-12 22:13:52 【问题描述】:

在 ActionScript 3 中,使用矢量图形肯定会严重损害项目的性能。

通过使用.copyPixels() 通过其BitmapData 对象代替所有矢量图形对所有图形使用单个Bitmap 将产生可笑的性能提升,并且对于像我这样在Flash 中开发游戏的人来说是必不可少的。

除此之外,我不确定我应该定位和尝试优化的下一个主要内容是什么。我确实使用了很多内置的三角函数,但它们似乎并没有太大的影响。我知道有一些库可以使用近似方法和类似方法来优化数学,但到目前为止我还没有发现这些是必要的。

还有其他我应该关注的大量已知点吗?我更多地指的是我应该注意的内置事物(比如避免矢量渲染),而不是如何改进我自己的编码风格。

【问题讨论】:

【参考方案1】:

我发现有用的文档是:

Optimizing Performance for the Adobe Flash Platform ActionScript 3.0 and AVM2 Performance Tuning by Gary Grossman Building High Performance iPhone Applications by Mike Chambers

一些亮点:

Choose appropriate display objects

限制内存使用的最简单的优化技巧之一是 使用适当类型的display object。对于简单的形状 非交互式,使用Shape 对象。对于interactive objects 没有 需要时间线,使用Sprite 对象。对于使用 时间线,使用MovieClip 对象。

Use getSize() to benchmark code

getSize() 返回指定对象在内存中的大小。

Choose appropriate primitive types to conserve memory

除String 之外的所有原始类型在内存中使用 4 - 8 个字节。一种 Number,代表一个 64 位的值,被分配了 8 个字节 ActionScript 虚拟机 (AVM)(如果未为其分配值)。 String 类型的行为不同。基准代码和 确定任务最有效的对象。

Reuse objects

通过重用对象来优化内存并避免在任何时候重新创建它们 可能。

Use object pooling

重用对象减少了实例化对象的需要,这可以 昂贵的。它还减少了垃圾收集器的机会 运行,这可能会减慢您的应用程序。

Free memory

要确保对象是garbage collected,请删除所有 对象的引用。内存分配,而不是对象 删除,触发垃圾回收。尝试限制垃圾 集合通过尽可能多地重用对象来传递。另外,设置 尽可能引用 null,以便垃圾收集器 花费更少的处理时间来查找对象。想想垃圾 收集作为保险,并始终管理对象生命周期 尽可能明确。

将对显示对象的引用设置为 null 并不能确保 对象被冻结。对象继续消耗 CPU 周期,直到它 被垃圾回收了。

BitmapData 类包含一个 dispose() 方法,虽然 dispose 方法从内存中删除像素,仍然必须设置参考 为 null 以完全释放它。

Use bitmaps

使用向量,尤其是大量使用向量,会显着增加 需要 CPU 或 GPU 资源。使用bitmaps 是优化的好方法 渲染,因为运行时需要更少的处理资源 在屏幕上绘制像素而不是渲染矢量内容。

Avoid filters, including filters processed through Pixel Bender

当过滤器应用于显示对象时,运行时会创建两个 内存中的位图。使用外部创作的位图有助于 运行时以减少 CPU 或 GPU 负载。

Use mipmapping to scale large images

谨慎使用 mipmapping。虽然提高了画质 缩小的位图,它会影响带宽、内存和速度。

Use Text Engine for read-only text, TextField for input text

对于只读文本,最好使用Flash Text Engine,它 提供低内存使用和更好的渲染。对于输入文本, TextField 对象是更好的选择,因为更少的 ActionScript 代码 需要创建典型的行为,例如输入处理和 自动换行。

Use callbacks instead of events

使用本机事件模型可能会更慢并消耗更多内存 而不是使用传统的回调函数。事件对象必须是 在内存中创建和分配,这会降低性能。 例如,当监听Event.ENTER_FRAME 事件时,一个新的 在每个帧上为事件处理程序创建事件对象。 显示对象的性能可能特别慢,因为 捕获和冒泡阶段,如果显示 列表很复杂。

Freeze and unfreeze objects on added / removed from stage

即使显示对象不再在显示列表中并且 等待垃圾收集,他们仍然可以使用 CPU 密集型代码。

在加载远程内容时,冻结的概念也很重要 使用 Loader 类。

unloadAndStop() 方法允许您卸载 SWF 文件, 自动冻结加载的 SWF 文件中的每个对象,并强制 要运行的垃圾收集器。

Use Event.ACTIVATE and Event.DEACTIVATE events to detect background inactivity

Event.ACTIVATEEvent.DEACTIVATE 事件允许您检测 当运行时获得或失去焦点时。结果,代码可以 优化以响应上下文变化。

activate 和 deactivate 事件允许您实现类似的 有时在移动设备上发现的“暂停和恢复”功能的机制 设备和上网本。

Disable mouse interaction when possible

在许多交互时检测鼠标交互可能会占用大量 CPU 对象显示在屏幕上,尤其是当它们重叠时。什么时候 可能,请考虑禁用鼠标交互,这有助于您 应用程序使用更少的 CPU 处理,因此,减少 移动设备上的电池使用情况。

Use Timers for non-animated content

对于非动画,计时器优于 Event.ENTER_FRAME 事件 长时间执行的内容。

计时器的行为方式类似于Event.ENTER_FRAME 事件,但 事件可以在不受帧速率约束的情况下被调度。这 行为可以提供一些重要的优化。考虑一个视频 播放器应用程序为例。在这种情况下,您不需要使用 高帧率,因为只有应用程序控件在移动。

Limit tweening

限制使用补间,这可以节省 CPU 处理、内存和 电池寿命有助于内容在低端设备上更快地运行。

Use Vector vs. Array

Vector 类允许比 Array 更快的读写访问 类。

使用 Vector 时,数组元素的访问和迭代要快得多 比使用数组时的实例。

在严格模式下,编译器可以识别数据类型错误。

运行时范围检查(或固定长度检查)增加 可靠性明显优于阵列。

Use drawing API for faster code execution

使用drawPath()减少代码执行量, drawGraphicsData(), drawTriangles() 更少的行 代码可以提供更好的 ActionScript 执行性能。

Use event capture and bubbling to minimize event handlers

利用事件的冒泡可以帮助您优化 ActionScript 代码执行时间。您可以注册一个事件处理程序 一个对象,而不是多个对象,以提高性能。

Paint pixels using setVector() method

在绘制像素时,可以通过以下方式进行一些简单的优化 使用 BitmapData 类的适当方法。一种快速的方法 绘制像素是使用setVector() 方法。

lock() and unlock() BitmapData when using slow methods like setPixel() or setPixel32()

调用lock()unlock() 会阻止屏幕更新 不必要的。迭代像素的方法,例如getPixel()getPixel32()setPixel()setPixel32(),可能会很慢, 尤其是在移动设备上。如果可能,请使用检索方法 一次调用中的所有像素。要读取像素,请使用getVector() 方法,比getPixels() 方法快。另外,记得要 尽可能使用依赖于 Vector 对象的 API 可能跑得更快。

Use String class methods instead of regular expressions

当String 类方法可用时,它的运行速度比 等价的正则表达式并且不需要创建 另一个对象。

For TextFields, use apendText() instead of the += operator

使用appendText() 方法可以提高性能。

Square bracket operator [] can slow performance - store a reference in a local variable

使用方括号运算符会降低性能。你可以 通过将引用存储在局部变量中来避免使用它。

Reduce number of function calls by moving code inline

调用函数可能很昂贵。尝试减少数量 通过内联移动代码来调用函数。

移动函数调用内联会导致代码超过四个 快几倍。

Avoid placing content off-stage

即使舞台外的元素没有显示在屏幕上,也没有 渲染后,它们仍然存在于显示列表中。运行时继续 对这些元素进行内部测试,以确保它们是 仍然在舞台外,用户没有与他们互动。

Avoid using alpha property

当显示对象使用alpha混合时,运行时必须结合 每个堆叠显示对象和背景的颜色值 颜色来确定最终的颜色。因此,阿尔法混合可以更多 处理器密集型比绘制不透明的颜色。这个额外的 计算会损害慢速设备的性能。

Use lowest possible frame rate

更高的帧速率会消耗更多的 CPU 周期和能量 电池比更低的速率。

Runtime code execution fundamentals

Use bitmap caching for complex vector content

此功能缓存矢量对象,将其渲染为位图 在内部,并使用该位图进行渲染。位图缓存 如果缓存的内容未旋转、缩放或 每一帧都改变了。除翻译外的任何转换 x 轴和 y 轴,渲染没有改善。

Set cacheAsBitmapMatrix property when using cached bitmaps in mobile AIR apps

cacheAsBitmapMatrix 在 AIR 移动配置文件中,您可以应用任何 在不重新生成对象的情况下对对象进行二维变换 缓存位图。您也可以更改 alpha 属性而不 重新生成缓存的位图。

Use BitmapData class to create custom bitmap caching behavior

仅使用一个缓存位图在内存中使用并由所有共享 实例。

Isolate events such as Event.ENTER_FRAME in a single handler

这种技术可以节省 CPU 资源。

Use the bitmap caching feature and the opaqueBackground property to improve text rendering performance

位图缓存功能允许您将矢量内容缓存为 位图以提高渲染性能。此功能有助于 复杂的矢量内容以及与文本内容一起使用时 需要渲染处理。

Alpha 透明度给运行时带来了额外的负担 绘制透明位图图像。您可以使用 opaqueBackground 属性绕过它,通过指定一个 颜色作为背景。

Enable GPU hardware graphics acceleration

为了利用 AIR 对 Flash 内容的 GPU 加速, 移动平台,Adobe 建议您使用renderMode="direct" (即 Stage3D)而不是 renderMode="gpu"。 Adobe 正式 支持并推荐以下基于Stage3D 的框架: Starling (2D) 和 Away3D (3D)。

避免在 html 嵌入中使用 wmode=transparent or wmode=opaque 参数。这些模式会导致性能下降。他们能 也会导致两者的音频-视频同步损失很小 软件和硬件渲染。此外,许多平台不 在这些模式生效时支持 GPU 渲染,显着 影响性能。

Favor using asynchronous versions of operations

当前执行线程中的应用程序代码继续执行。

异步操作被调度和划分以避免渲染 问题。因此,更容易获得响应式 使用异步操作版本的应用程序。请参阅 Perceived performance versus actual performance 了解更多信息。

Smooth shapes to improve rendering

与位图不同,渲染矢量内容需要很多计算, 特别是对于包含许多控制的渐变和复杂路径 点。作为设计师或开发人员,请确保形状是 足够优化。

Cache assets locally after loading them, instead of loading them from the network each time they're needed

如果您的应用程序加载媒体或数据等资产,请缓存 通过将资产保存到本地设备。对于发生变化的资产 不经常考虑更新缓存。

Use the StageVideo class to take advantage of hardware acceleration

使用StageVideo 类来利用硬件加速 展示视频。

这种方法充分利用了底层视频硬件。 结果是 CPU 上的负载要低得多,这意味着 在功能较弱的设备上更高的帧速率和更少的内存 用法。

The AAC audio format offers better quality and smaller file size than the mp3 format at an equivalent bit rate

与视频解码类似,音频解码需要较高的 CPU 周期和 可以通过利用设备上的可用硬件进行优化。

AAC 格式比 具有同等比特率的 mp3 格式。

Minimize code in constructors

初始化函数如constructors被解释, 其他一切都是 JIT。

【讨论】:

很棒的答案! +1。我还想添加避免使用MouseEvent.MOUSE_MOVE(尤其是在针对移动设备时)。有一个简单的解决方法,即立即从其处理程序中删除MOUSE_MOVE 事件侦听器,基本上只调用一次,然后将其传递给ENTER_FRAME 事件处理程序。 关于 enterframe 事件 - 它也可以静态分配,因为“只能有一个”(c)但是“消除”enterframe 事件主要归结为减少显示列表的总大小,也就是位。关于计时器 - 他们可以搞砸实时游戏,所以应该非常谨慎地对待这个建议。我个人讨厌计时器事件与基于帧的事件穿插在一起,以便您触发某些东西,并且它会持续一个计时器和/或导致代码滞后,并且它的效果可以通过帧事件获得,因此这种东西的实际使用会有所不同,并且随机。 看来构造函数中的代码实际上并不慢(即使它不是 JIT-ed),基准:jacksondunstan.com/articles/276 和 konsnos.wordpress.com/2012/06/21/… @fsbmain - 深度继承链、大量实例化/内存分配更生动地展示了效果。第一篇文章没有正确测试;第二篇文章显示构造函数较慢。 根据我的经验,Alpha 的 cpu 非常重,而且我发现渲染为高分辨率(例如 4k 屏幕)的复杂矢量确实很麻烦。

以上是关于除了渲染向量之外,AS3 中的主要性能影响因素是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Windows桌面双因素认证流程是啥?

影响数据库性能的主要因素都有哪些?

哪些因素影响了数据库性能

影响服务器性能的四个主要因素

Flash性能——游戏性能优化

浏览器原理 24 # 页面性能:如何系统地优化页面?