Skip to content

性能评估

概述

PC编辑器内置了dump profile功能,可以帮助开发者分析地图运行过程中的性能开销与内存分配情况。开启后,可以生成一个直观的火焰图(HTML报告),其中包含:

  • 指定区间内Lua代码的执行栈耗时
  • 区间开始时、结束时以及差值(diff)的内存分配栈

这对于排查卡顿、定位热点函数和发现内存泄漏非常有用。

注意: 性能评估相关API依赖 开发者模式 ,仅在PC编辑器内试玩时可用,详见 Lua环境 - 开发者模式

使用前的准备

性能评估涉及到对Lua执行栈、内存分配栈的实时记录,开启后会带来额外的开销。其中:

  • debug.start_memory_record()会持续记录所有内存分配栈,会显著增加内存占用
  • debug.start_profile() ~ debug.end_profile()期间,会记录函数执行栈,也会带来额外的CPU与内存开销。

在开启性能评估前,请务必先保存好您当前正在编辑的地图,以避免编辑器在压力较大时出现异常导致工作丢失。 同时,建议在外放(发布)地图前,移除所有的性能评估相关代码

基本使用流程

1. 启用内存记录

main.lua的最开始处启用开发者模式,并开启内存记录:

lua
if LuaAPI.enable_developer_mode() then
    debug.start_memory_record()
end

关于开启时机: 内存栈的捕获依赖于start_memory_record的调用时机——只有在它被调用之后发生的内存分配才能被追踪到。如非特殊需要,强烈建议按上述示例所示,从main.lua入口处就开始记录,这样才能完整捕获到地图运行期间的全部内存分配信息。

2. 开始Profile

在游戏运行过程中,需要分析的逻辑执行 之前 ,在VSCode控制台中输入:

lua
debug.start_profile()

3. 执行需要分析的逻辑

正常游玩或触发您希望进行性能分析的游戏逻辑。

4. 结束Profile并导出报告

逻辑执行完毕后,在VSCode控制台中输入:

lua
debug.end_profile()
debug.dump_profile_stacks("profile.html")

dump_profile_stacks的参数为输出报告的文件路径。如果是相对路径,则会生成在蛋仔安装目录下。

报告解读

打开生成的HTML文件,可以看到如下内容:

报告主要包含两部分:

  • 上半部分:start_profileend_profile期间的执行栈耗时火焰图。火焰图越宽,代表对应函数占用的执行时间越长,是性能优化的重点关注对象。
  • 下半部分: 三个内存分配栈视图,分别对应:
    • 开始时(Begin): Profile开始时累计的内存分配快照;
    • 差值(Diff): Profile期间新增的内存分配,可用于发现疑似的内存泄漏或额外的分配热点;
    • 结束时(End): Profile结束时累计的内存分配快照。

相关API速查

API说明
debug.start_memory_record()开始记录Lua的内存分配栈,会增加内存占用,建议在main.lua入口处调用
debug.start_profile()开始记录Lua执行栈耗时
debug.end_profile()结束记录Lua执行栈耗时
debug.dump_profile_stacks(filename)将当前记录的执行栈与内存分配栈导出为HTML报告

再次提醒: 上述debug库下的API仅在 开发者模式 下可用,且仅限PC编辑器试玩。在手机版蛋仔编辑器以及发布后的地图内均无效,您发布的游戏逻辑不可依赖这些API。