代码之家  ›  专栏  ›  技术社区  ›  Kai

AS3非类型化可变效率

  •  1
  • Kai  · 技术社区  · 15 年前

    我仍在努力解决我的2dflash游戏中的一个问题,我的帧速率下降到了无法接受的低点。我有一个具有以下成员变量和方法的类:

    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 回复  |  直到 15 年前
        1
  •  4
  •   fenomas    15 年前

    总而言之, .强类型化是AS3比AS2快的主要原因之一(因为在AS2中,所有变量都是非类型化的,每次引用非类型化变量flash都必须在内部检查它是什么类型)。

    通常,对于这样一个问题,我会对性能调优的缺陷、体系结构更改通常如何比代码级调优更有效、以及大多数内容如何被呈现而不是代码执行所限制等等进行讨论。但是在这种情况下,使用类型化变量无论如何都是您应该做的事情,因为它使您的代码更健壮、更可读、更易于维护,并且不太容易出错。

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

        2
  •  1
  •   Richard Szalay    15 年前

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

    在Flash游戏中,慢速帧速率通常与代码无关。尝试打开“重绘区域”并查看在每帧上重绘的内容-您可能重绘过多。

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

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

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

        3
  •  1
  •   Allan    15 年前

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

    调用一个属性或函数确实会产生开销,但是如果将变量公开并直接访问它,那么OOP就不太好了,它将提高性能。

    我也怀疑是别的原因导致你的帧速率下降。因为看起来你在做某种碰撞检测,如果你不这样做的话,你应该看看四叉树。四叉树分割区域,这样可以减少检查碰撞的数量。

        4
  •  0
  •   Community basarat    7 年前

    如果可以在调试器下运行它,请将每帧代码放在一个简单的循环中,然后 try this .