我可以在Phaser游戏更新循环中声明的功能数量有限制吗?如果更新循环中有很多函数,性能是否会降低?
答案 0 :(得分:2)
声明和调用函数
之间存在差异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做的一些事情比其他事情要慢。一些开发人员已经做了足够长的时间来估计什么“太慢”才能工作,但是许多2D游戏都会很好,而不必过于关注优化(使得内存在使用的内存或时间方面更有效)。
好主意和坏主意
一些不好的想法:如果你在屏幕上有50,000个精灵(虽然有些机器非常强大,特别是当Phaser设置为使用WebGL时),即使你从未更新它们,它们往往需要很长时间才能绘制。如果你有10,000个精灵互相弹跳并相互碰撞,碰撞检测通常需要很长时间才能更新,即使某些机器可以能够正确地绘制它们。
最好的建议是尽你所能,但不要做任何事情。开始时尽量使您的设计尽可能简单。通过有趣的游戏机制增加复杂性,而不是通过计算昂贵的逻辑。
如果所有其他方法都失败了,有时您可以将工作拆分为多个更新,或者可能有一些事情可以执行每个其他更新或每个 n 更新(如果您可以执行不同的工作,则效果最佳做其他更新,所以你不只是比其他更新慢一些。)