首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3非类型化变量效率

AS3非类型化变量效率
EN

Stack Overflow用户
提问于 2009-09-30 14:56:25
回答 4查看 734关注 0票数 1

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

代码语言:javascript
复制
protected var value:*;
public function getValue () :* {
    return this.value;
}

现在,这个方法似乎每帧被调用了几百次,2.23%的应用时间都花在了这个方法上。

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

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

代码语言:javascript
复制
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%)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-01 05:06:43

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

通常,对于这样的问题,我会支支吾吾地谈论性能调优的陷阱,关于架构更改通常比代码级调优更有效,以及大多数内容是如何通过呈现而不是代码执行来实现瓶颈的……但在这种情况下,您无论如何都应该使用类型化变量,因为它使您的代码更健壮、更具可读性、更易于维护,并且不容易出现bug。

在AS3中使用无类型变量真的没有很好的理由。花点时间做这个改变,即使你看不到性能的提高,从长远来看,它也会有回报的(尽管我认为你会的)。

票数 4
EN

Stack Overflow用户

发布于 2009-09-30 15:02:12

既然你已经在使用这个配置文件了,为什么你不试试看看呢?

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2009-09-30 23:18:15

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

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

我还怀疑其他原因可能是你的帧率下降的原因。由于您似乎正在进行某种类型的碰撞检测,如果您没有这样做,那么您应该检查一下四叉树。四元树将区域拆分,以便您可以减少冲突的检查量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1498644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档