我(仍然)试图解决我的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%)发布于 2009-10-01 05:06:43
一言以蔽之,yes。强类型是AS3比AS2快的主要原因之一(因为在AS2中,所有变量都是无类型的,每次引用无类型变量时,Flash都必须在内部检查它是什么类型)。
通常,对于这样的问题,我会支支吾吾地谈论性能调优的陷阱,关于架构更改通常比代码级调优更有效,以及大多数内容是如何通过呈现而不是代码执行来实现瓶颈的……但在这种情况下,您无论如何都应该使用类型化变量,因为它使您的代码更健壮、更具可读性、更易于维护,并且不容易出现bug。
在AS3中使用无类型变量真的没有很好的理由。花点时间做这个改变,即使你看不到性能的提高,从长远来看,它也会有回报的(尽管我认为你会的)。
发布于 2009-09-30 15:02:12
既然你已经在使用这个配置文件了,为什么你不试试看看呢?
在Flash游戏中缓慢的帧率通常与代码无关。试着打开“重画区域”,看看每一帧上重绘了什么--你可能重画得太多了。
关于主题,您没有理由使用*,除非状态也可以是一个命名空间。其他一切都继承自Object。您的州没有共同的祖先或接口吗?
编辑:实际上,现在我想起来了,你经常调用getValue。假设每帧调用一次CollisionManager.detectCollisions,则每帧调用getValue 1356次。
如果您在一个方法中多次调用此方法,请尝试获取一次值并将其存储在一个本地(作用域为函数)变量中。您甚至可以将该值传递给其他方法,以减少此函数的调用次数。
发布于 2009-09-30 23:18:15
首先,你应该使用类型化的变量。它提高了代码的可读性,确保了类型安全,并可以提高性能。我发现唯一需要使用:*的情况是,当我编写一个集合类,并希望它可用于各种不同的类型时(Adobe引入泛型!)。
调用属性或函数确实会产生开销,而如果您将变量设置为公共变量并直接访问它,则不是很好的OOP,这将提高性能。
我还怀疑其他原因可能是你的帧率下降的原因。由于您似乎正在进行某种类型的碰撞检测,如果您没有这样做,那么您应该检查一下四叉树。四元树将区域拆分,以便您可以减少冲突的检查量。
https://stackoverflow.com/questions/1498644
复制相似问题