【问题标题】:AS3 rendering bitmaps in GPU modeAS3 在 GPU 模式下渲染位图
【发布时间】:2015-03-21 11:02:09
【问题描述】:

Flash Pro CC、AS3、Air for Android (v17)、渲染模式 GPU、舞台质量。LOW,FPS:60,测试设备:旧的 Nexus One 智能手机 (Android 2.3.3)。

指南说 GPU 使渲染位图变得便宜,不知何故我无法理解它是如何工作的。

所以我有 49 个单独的位图方块覆盖舞台,中间有一个 MovieClip,中间有一个位图,可以上下移动(跳球)。很简单吧?

这是视图:http://i.stack.imgur.com/EKcJ6.png

  1. 所有图形都是位图(不是矢量)。然而我得到 55 fps(它在 53-57 左右变化)。

  2. 然后我选择所有 49 个方块并将它们放在一个符号 (MovieClip) 中。视觉上没有任何变化。它似乎略微提高了 FPS,平均 fps 现在约为 57 (55-59)。

  3. 然后我获取 MovieClip(其中包含所有方块)并设置 cacheAsBitmap=true。瞧,现在我有 60 fps!

在所有 3 种不同的情况下发生了什么?为什么我需要将位图放入一个 MC 并将这个 MC 缓存为位图 - 方块不是已经位图了吗?

我还尝试将每个方块制作为 MovieClip 并将其缓存为位图,但我仍然获得 55 fps。

是否可以在 60 fps 时保持方块分开?

在我的真实项目中,我在舞台上有许多 MovieClip(约 100 个),但在大多数情况下,一次只有其中一个是动画的。然而不知何故,似乎仅仅存在其他影片剪辑就会降低性能(fps)。显然,我不能将它们全部放入一个 MC 并将其缓存为位图,就像上面的简化示例一样。

我该如何解决这个问题,我该怎么办?

谢谢!

【问题讨论】:

  • 为什么 Color Lines 游戏需要 60 fps? :)
  • 很好 ;) 为什么不是 60 fps?看起来比 30 fps 好多了。而且我知道即使动画比我拥有的更多,也应该可以达到 60 fps。只需要找到一种方法来优化它。
  • 动画在 30 fps 下已经看起来不错,要在 60 fps 下获得视觉差异,您需要至少 60 像素的距离,球必须垂直移动,因此每帧它至少会移动 1 像素。同样在 60 fps 时,电池会消耗得更快,因此在为移动设备设计游戏时,您还应该关心电池寿命。考虑到性能,请尝试将所有影片剪辑成单个位图。 (不缓存为位图,而是将它们中的每一个都放入真正的位图)
  • 我同意有时慢速动画不需要超过 30 fps,但在我的情况下,我可以亲眼看到 60 fps 看起来更流畅,我觉得应该可以在没有的情况下实现耗电很多,因为正如我所提到的,我的动画很简单,同时动画的对象很少。
  • 不是动画的原因。 Flash 项目具有默认帧速率作为其属性,并且无论您使用什么动画以及使用多少动画,它都会尝试以该帧速率运行。这就是 Adob​​e 所说的:“应用程序的帧速率决定了每个‘应用程序代码和渲染’周期有多少时间可用,如运行时代码执行基础中所述。[...] 更高的帧速率会消耗更多的 CPU 周期和能量从电池比一个更低的速率。”更多信息:help.adobe.com/en_US/as3/mobile/…

标签: android actionscript-3 flash bitmap gpu


【解决方案1】:

我认为这与best practice recommendation有关:

限制舞台上可见的项目数量。每个项目都需要一些时间 渲染和合成它周围的其他项目。当你没有 不再想显示显示对象,将其可见属性设置为 错误的。不要简单地将其移出舞台,将其隐藏在另一个物体后面, 或将其 alpha 属性设置为 0。如果显示对象不再 完全需要,使用 removeChild() 将其从舞台上移除。

通过将所有位图放在一个容器中并设置cacheAsBitmap=true,就合成器而言,您实际上是将它们变成了一个位图。这往往比多个单独的位图合成更快。将位图设置为cacheAsBitmap=true(或在具有cacheAsBitmap=true 的单个容器中)无效,因为它已经是位图。

另外请注意,不再推荐使用 GPU 模式,这是 Adob​​e 第一次尝试 GPU 加速显示,他们基本上放弃了这条道路,转而支持新的 Stage3D 渲染管道。虽然 GPU 渲染模式在使用得当的情况下可以很好地工作,但它可能有些难以预测和令人困惑,因此我强烈建议您查看 Stage3D。

希望对您有所帮助。

【讨论】:

  • Stage3D 也有它的缺点(纹理上传时间、内存限制导致崩溃、纹理质量、过滤器和遮罩棘手且充其量实现成本高昂,等等......)。只要 GPU 模式适合您正在制作的应用程序类型,它就可以正常工作,如果性能至关重要并且屏幕上必须有大量对象 Stage3D 可能是唯一可行的解​​决方案,如果不是这种情况,那么移动设备上的 GPU 模式是一种很好的解决方案。 (我只使用 GPU 模式在 Apply/google store 上发布了许多应用程序)
  • BotMaster,你能详细说明一下吗? GPU 模式最适合哪些类型的应用程序?我现在有一个想法,将所有内容都放入 cachedAsBitmap 容器中,当我需要为其中的某些内容设置动画时,我将其从容器移动到容器上方并进行动画处理,当动画完成后,我将其放回缓存容器中。
  • 好吧,这里有一些关于 GPU 模式的提示:help.adobe.com/en_US/as3/mobile/…
  • 通过将每个位图放入一个容器并将该容器缓存为位图,我在 GPU 模式下(甚至在我的旧 Nexus One 上)实现了 60 fps。当我需要一些 MC 动画时,我将其从容器中取出,将其放在容器上方并运行动画。动画结束后,我将其放回原处。这样一来,舞台上只有几个独立的 MC,并且动画不会减慢。如果我同时需要多个动画 MC,这是行不通的。
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 2018-06-09
  • 2022-01-14
相关资源
最近更新 更多