我(仍然)试图在我的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%)
答案 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。