在 Screeps 游戏中,性能优化一直都是非常重要的一环。尽管我们可以通过手动插入 console.time
和 console.timeEnd
进行代码运行时间的计算,但这种方法并不太好用,并且会浪费时间和精力。现在,我们可以使用 @types/screeps-profiler
这个 npm 包来更加轻松地追踪和优化我们的代码。
安装
首先,我们需要安装 @types/screeps-profiler
。在命令行中,输入以下命令即可:
npm install @types/screeps-profiler
追踪
在您的代码文件中,只需添加两行代码即可开始追踪。第一行应该在您的游戏启动时的主文件中添加:
import { wrapScreeps } from '@screeps/profiler'; wrapScreeps();
这个函数的作用是将 Game
对象的所有原型方法包装在一个新的函数中,用于测量它们的执行时间。它还会在控制台中打印一个聚合报告,列出每个函数的执行时间和调用次数。无需担心性能问题,因为它不会改变执行时间,而且只在输出时使用 console
。
现在,您需要失败每个要追踪的函数的调用:
import { registerFN } from '@screeps/profiler'; registerFN(fn, 'name');
其中,fn
是要包装的函数,'name'
是要为它设置的名称。在这样一段例子中,我们遍历 Game.rooms
并在控制台中输出它们的名称:
import { registerFN } from '@screeps/profiler'; for (const roomName in Game.rooms) { const room = Game.rooms[roomName]; registerFN(() => console.log(room.name), 'Room.prototype.getName'); }
现在,我们可以重新加载代码并访问 Screeps 控制台以查看精美的可视化报告了!
优化
最后,您可能会发现代码中的一些性能瓶颈,并需要进行优化。例如,在我们的示例中,我们已经确定了可以进一步优化代码的区域,例如移除不必要的函数调用。最好的方法是仅在必要时使用 registerFN
,而不是在程序的每个角落使用它。
例如,为了了解一个对象是否为 null,您实际上不需要调用 registerFN
,因为它对性能的影响极小:
if (object !== null) { // Object is not null }
在一些重要的函数上使用 registerFN
,而在次要的地方则不要,这样您就不会造成额外的反响并确保您的游戏性能得到提高!
结论
通过使用 @types/screeps-profiler
,您可以更快地找出需要优化的区域,绕过艰难的手动测量,并在不需要修改模块的情况下访问有用的报告。这样一来,您的 Screeps 游戏会运行得更快,更流畅,并能够处理更多的逻辑!
示例代码
以下是我们上文中提到的 示例代码,您可以将其用于实际的 Screeps 游戏中:
-- -------------------- ---- ------- ------ - ------------ ---------- - ---- -------------------- -- ------- ---------------------------- ---- --- -------- ------- ------------------------------------------------- -------------------------------- ------ ----- ---- - -------------- -- - -- ------- --- ---- ---- ------------- -- - --------------------- ---- -- - -- ------- ----------------------- ------------------------- --------------------------- -- ------- ------------------------ -------------------------- ---------------------------- --- -- ------------ ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5eedc1dbb5cbfe1ea0611f4d