我可以在 Phaser 游戏更新循环中声明多少个函数?
How many functions can I declare in phaser game update loop?
在 Phaser 游戏更新循环中可以声明多少个函数是否有任何限制?如果更新循环中有很多函数,性能会降低吗?
声明和调用函数
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 个更新执行一些操作(如果您可以对其他更新执行不同的工作,因此您不只是让某些更新比其他更新慢)。
在 Phaser 游戏更新循环中可以声明多少个函数是否有任何限制?如果更新循环中有很多函数,性能会降低吗?
声明和调用函数
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 个更新执行一些操作(如果您可以对其他更新执行不同的工作,因此您不只是让某些更新比其他更新慢)。