性能评估
概述
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_profile到end_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。
