AS3无类型变量效率

时间:2009-09-30 14:56:25

标签: actionscript-3 performance untyped-variables

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

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

现在,这种方法每帧被称为几百次,我的应用时间的2.​​23%用于该方法。

你是否认为通过使value成为一个类型变量,我会注意到显着性能提升?使变量类型化会使应用程序的代码中断,所以我想更确定它实际上会有所帮助。

此外,这是我的应用程序的性能配置文件的前几个记录,按自我时间排序,这使我首先怀疑这个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%)

4 个答案:

答案 0 :(得分:4)

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

通常对于这样的问题,我会讨论性能调优的缺陷,关于架构更改通常比代码级调优更有效,以及大多数内容是如何通过呈现而不是代码执行来实现瓶颈的。但是在这种情况下,使用类型变量是你应该做的事情,因为它使你的代码更健壮,更易读,更容易维护,并且不容易出错。

在AS3中使用无类型变量真的没有充分的理由。花点时间做这个改变,即使你没有看到性能提升,它也会在长期内得到回报(尽管我认为你会这样做)。

答案 1 :(得分:1)

鉴于您已经在使用该个人资料,为什么不试试看?

Flash游戏中的慢速帧速率通常与代码无关。尝试启用“重绘区域”并查看每帧上正在重绘的内容 - 您可能重绘得太多了。

关于主题,您没有理由使用*,除非状态也可以是命名空间。其他所有内容都来自Object。你的州没有共同的祖先或界面吗?

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

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

答案 2 :(得分:1)

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

调用属性或函数确实会产生开销,而如果将变量设置为public并直接访问它则不会很好OOP,这会提高性能。

我还怀疑其他东西可能会导致您的帧速率下降。因为看起来你正在进行某种碰撞检测,所以如果你没有这样做,你应该看看四叉树。四叉树分割区域,以便您可以减少检查碰撞的数量。

答案 3 :(得分:0)

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