【问题标题】:AS3 Untyped Variable EfficiencyAS3 无类型变量效率
【发布时间】:2009-09-30 14:56:24
【问题描述】:

我(仍在)试图解决我的 2D Flash 游戏中的一个问题,即我的帧率下降到无法接受的低点。我有一个具有以下成员变量和方法的类:

protected var value:*;
public function getValue () :* {
    return this.value;
}

现在,该方法似乎每帧被调用数百次,而我的应用程序时间的 2.23% 花费在该方法上。

您认为通过将value 设为类型变量会显着提高性能吗?使该变量类型化将使整个应用程序中的代码中断,因此我想更加确定它是否真的会有所帮助。

此外,这是我的应用程序的性能配置文件的前几条记录,按 Self Time 排序,这让我首先怀疑这个 getValue() 方法:

Method                             Calls    Self Time (ms)
------                             -----    --------------
[pre-render]                       0        2137 (19.68%)
[reap]                             0        727 (6.7%)
[enterFrameEvent]                  0        464 (4.27%)
[mouseEvent]                       0        352 (3.24%)
[mark]                             0        327 (3.01%)
State.getValue                     792356   242 (2.23%)
[verify]                           0        209 (1.93%)
[render]                           0        159 (1.46%)
CollisionManager.detectCollisions  584      156 (1.44%)
Entity.updateAllStates             30227    154 (1.42%)
Entity.getStateValue               392412   143 (1.32%)
GSVector.set y                     156244   141 (1.3%)
State.update                       659738   123 (1.13%)

【问题讨论】:

    标签: actionscript-3 performance untyped-variables


    【解决方案1】:

    总之,是的。强类型化是 AS3 比 AS2 快的主要原因之一(因为在 AS2 中所有变量都是无类型的,每次引用无类型变量时,Flash 都必须在内部检查它是什么类型)。

    通常,对于这样的问题,我会对性能调优的陷阱、架构更改通常比代码级调优更有效,以及大多数内容如何因渲染而不是代码执行而成为瓶颈。 . 但在这种情况下,无论如何你都应该使用类型化变量,因为它使你的代码更健壮、更易读、更易于维护并且不易出现错误。

    在 AS3 中使用无类型变量确实没有充分的理由。花点时间进行此更改,从长远来看,即使您没有看到性能提升(尽管我认为您会看到),它也会得到回报。

    【讨论】:

      【解决方案2】:

      鉴于您已经在使用配置文件,为什么不试试看呢?

      Flash 游戏中的慢帧率通常与代码无关。尝试打开“重绘区域”,看看每一帧都在重绘什么——你可能重绘太多了。

      就主题而言,您没有理由使用*,除非状态也可以是命名空间。其他一切都继承自Object。你们的州没有共同的祖先或接口吗?

      编辑:实际上,现在我想起来了,你经常调用 getValue。假设您每帧调用一次 CollisionManager.detectCollisions,则每帧调用 getValue 1356 次。

      如果您在一个方法中多次调用此方法,请尝试获取一次值并将其存储在本地(作用域为函数)变量中。您甚至可以将值传递给其他方法,以减少该函数的调用次数。

      【讨论】:

      • 这需要很多小时才能做出改变,所以我正在投票以了解大家的想法:) 感谢您提供有关重绘的提示!
      【解决方案3】:

      首先,您应该使用类型化变量。它提高了代码的可读性,确保了类型安全并可以提高性能。我发现需要使用 :* 的唯一情况是我正在编写一个集合类并希望它可用于各种不同的类型(Adobe 引入了泛型!)。

      调用属性或函数确实会产生开销,但如果您将变量设为公共并直接访问它会提高性能,这并不是很好的 OOP。

      我还怀疑其他原因可能导致您的帧速率下降。因为看起来你正在做某种碰撞检测,如果你不这样做,你应该看看四叉树。四叉树分割区域,这样您就可以减少检查碰撞的次数。

      【讨论】:

      • 您应该在收集场景中使用 Object。正如我在回答中提到的,* 只会添加命名空间之类的东西。
      • AS3 中的 Array 和 Dictionary 类似乎都有 * 的返回类型,所以我保持它与它们的集合类一致。您可以对此进行测试,因为对象还不能未定义 Dictionary 和 Array 可以返回未定义,因此它们必须返回 *
      【解决方案4】:

      如果您可以在调试器下运行它,请将您的每帧代码放在一个完全循环中,然后try this

      【讨论】:

        猜你喜欢
        • 2018-04-18
        • 2012-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-20
        • 2010-12-25
        相关资源
        最近更新 更多