【问题标题】:Are off-stage DisplayObjects in Flash still slowing down my game?Flash 中的舞台外显示对象是否仍在减慢我的游戏速度?
【发布时间】:2012-03-11 09:10:23
【问题描述】:

Flash 如何处理舞台外的元素?

显然 Flash 并没有实际渲染它们(因为它们不会出现在屏幕上的任何位置),但是渲染它们的过程是否仍然存在,这会减慢我的游戏速度,就像元素在屏幕上一样?

或者 Flash 是否会智能地忽略不属于可渲染区域的元素?

我是否应该手动管理从DisplayList 中移除对象并将它们重新添加为出口并进入舞台,或者这将无关紧要?

【问题讨论】:

  • 你可以写一个简单的测试。虽然它们没有被渲染,但它们仍然在层次结构中,并且可能正在做一些令人讨厌的事情,比如动画、执行脚本和调度大量事件。
  • 我认为对象的实际绘制消耗了大部分性能 - 因此,当它们不在舞台上时,这应该不是问题。但正如 valentin 所说,当他们仍在“执行脚本和/或发送大量事件”时,他们肯定会减慢整个游戏的速度。如果他们不会重新出现在舞台上,就摧毁他们——如果他们愿意,试着“暂停”他们,直到他们重新出现......
  • 我同意您应该编写一些测试,获取一大堆对象并在屏幕内外设置动画,使用 Flash Builder 分析器您应该能够找到任何瓶颈。我会测试只是看到它们离开屏幕,并测试 removeChild() 并在离开屏幕后可见,但不要使用 alpha 0。

标签: performance flash actionscript-3 rendering


【解决方案1】:

即使某些显示对象超出舞台区域,它们仍然会被执行。如果他们在其中播放任何动画,则可能会降低性能。

问题来了,为什么我们需要将未使用的物品放在舞台区域之外?如果您需要“缓存”movieClip 以加快加载速度,请将它们加载到控件永远不会移动的关键帧中。例如。加载要在第 1 帧中显示的显示对象,然后在该帧的操作面板中放置一个 stop(),使其成为关键帧,并在第 2 帧中加载未使用的动画。由于第 1 帧中有一个 stop(),因此控件永远不会进入第 2 帧,但显示对象会被缓存。

或者,如果您在未使用的显示对象中有代码,因此需要将它们与主要游戏组件一起加载,那么请尝试将 stop() 放入未使用的显示对象的帧中,以便它们不会动画。

【讨论】:

    【解决方案2】:

    是的,它们正在减慢您的游戏速度。

    在我早期的一个实验中,我开发了一个横向卷轴游戏,其中有许多 NPC 分散在地图上,并非都在同一个屏幕上可见。我仍然需要计算东西,但它们不在屏幕上。当我在不相关的情况下将它们从显示列表中删除(通过简单地检查它们与“相机”相关的 X)时,性能明显更好。同样,我不是在谈论可能附加到它们的其他代码和事件,只是电影剪辑的普通图形子项。

    根据我的经验,最好的做法是在位图中绘制对象。当然,如果您已经对游戏过于深入,这可能无关紧要,但如果您有时间投资,这是充分利用 AS3 的 2D 游戏的最佳方式之一。我在 8bitrocket 中找到了一些关于位图和 AS3 的最棒的教程 http://www.8bitrocket.com/books/the-essential-guide-to-flash-games/ 如果你愿意,我可以详细说明这个主题,但我想我在这里跑题了。

    【讨论】:

    • 良好的背景 - 以及关于位图的良好建议;这是我长期以来一直在做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多