我可以在 Phaser 游戏更新循环中声明多少个函数?

How many functions can I declare in phaser game update loop?

在 Phaser 游戏更新循环中可以声明多少个函数是否有任何限制?如果更新循环中有很多函数,性能会降低吗?

声明和调用函数

有区别declaring a function

function foo(n) {
    return n + 1;
}

并调用函数:

var bar = foo(3);

如果你真的想声明,你确实可以在 update 中声明函数,因为 JavaScript 支持嵌套和闭包:

function update() {
    function updateSomeThings() {
        ...
    }
    function updateSomeOtherThings() {
        ....
    }
}

这对性能的影响可以忽略不计,因为此代码段实际上并未调用任何这些函数。但是,如果稍后在 update 你给他们打电话:

        updateSomeThings();
        updateSomeOtherThings();

那么是的,这是有代价的。

注意:您不必在 update 中声明函数 本身来调用它们! 您可以调用在别处声明的函数,只要它们是 in scope。如果这太令人困惑,值得一看 JavaScript 指南。

函数调用的成本

您调用的每个函数都需要时间来执行。它花费的时间取决于函数的复杂程度(它做了多少工作),并且它可能会调用其他也需要时间执行的函数。这可能是显而易见的,但函数的总执行时间是该函数内所有代码执行时间的总和,包括它调用的任何函数(以及它们调用的函数等)所花费的时间。

帧率

Phaser 默认的目标是 运行 每秒 60 ,这对于游戏来说是非常标准的。这意味着它将尝试每秒更新和绘制游戏 60 次。除了每次调用您的 update 函数之外,Phaser 还做其他事情,其中​​最重要的是绘制您的游戏,但它还有其他内务处理工作要做。根据游戏的不同,您的大部分帧时间最终可能会被更新或绘图占用。

您当然希望用不到 1/60 秒(约 16 毫秒)的时间来完成更新,并且假设 Phaser 绘制游戏的速度非常快。

您在 Phaser 中执行的某些操作比其他操作慢。一些开发人员已经做了足够长的时间来估计什么是 "too slow" 工作,但许多 2D 游戏会很好,无需过多关注优化(使事情 运行 在内存使用方面更有效或花费的时间)。

好的和坏的想法

一些坏主意:如果屏幕上有 50,000 个精灵(虽然有些机器非常强大,尤其是当 Phaser 设置为使用 WebGL 时),即使您从不更新它们,它们通常也会花费太长时间来绘制。如果你有 10,000 个精灵相互弹跳和碰撞,碰撞检测通常会花费太长时间来更新,即使一些机器可能能够很好地绘制它们。

最好的建议是做所有你必须做的事情,但不要做你不做的事情。开始时尽量让您的设计尽可能简单。通过有趣的游戏机制增加复杂性,而不是通过计算昂贵的逻辑。

如果所有其他方法都失败了,有时您可以将工作拆分到多个更新中,或者您可以每隔一个更新或每个 n 个更新执行一些操作(如果您可以对其他更新执行不同的工作,因此您不只是让某些更新比其他更新慢)。