我(仍然)试图解决我的 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%)
有帮助吗?

解决方案

在一个字,即可。强类型的原理原因AS3比AS2(因为在AS2所有变量无类型,和您引用每次一个无类型变量的Flash有内部检查它是什么类型)。

一个快

通常为这样的问题我下摆和约性能调整,的陷阱山楂关于建筑变化通常如何比代码级调谐更有效,以及如何最内容是由呈现,而不是代码的执行瓶颈.. 。但在这种情况下,使用类型变量的东西,你应该这样做无论如何,因为它使你的代码更健壮,更具可读性,更容易维护,而且不易发生错误。

有真的在AS3使用无类型变量没有很好的理由。花时间来做出这种改变,它会在长期内还清,即使你看不到的性能提升(虽然我认为你会)。

其他提示

既然你已经在使用的个人资料,你为什么不只是尝试一下,看看?

在Flash游戏

慢帧率通常不码相关。尝试打开“重绘区域”,看看正在重绘每一帧 - 你可能重绘太多

在主题,没有理由让你使用*,除非国家也可以是一个命名空间。其他的都是从Object继承。难道你的国家不具有共同的祖先或接口?

编辑:其实,现在我想想,您呼叫的getValue了很多。假设你在呼唤CollisionManager.detectCollisions每帧一次,您呼叫的getValue每帧的1356倍。

如果您是一个方法中调用此方法多次,尝试所获得的价值,一旦并将其存储在本地(作用域为函数)变量。你甚至可以在价值传递到其他的方法,来减少这个函数的调用次数。

首先,你应该使用类型变量。它提高了代码的可读性,确保类型安全,并能提高性能。唯一的情况我已经找到了需要使用:*是,当我写一个集合类,并希望它是可重复使用的各种不同类型的(!的Adobe带来仿制药)

调用属性,或者如果你所做的可变公开和直接访问它,它会提高性能,功能不收取费用,而这是不是很大OOP。

我也怀疑是别的东西可占你的帧速率下降。因为它似乎你正在做某种碰撞检测,你应该看看到四叉树,如果你不这样做。四树分割区域,这样就可以减少碰撞检测的量。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top