Lua性能分析实战:10分钟揪出内存泄漏
【免费下载链接】Miku-LuaProfiler项目地址: https://gitcode.com/gh_mirrors/mi/Miku-LuaProfiler
Miku-LuaProfiler 是一款专为 Unity 打造的 Lua 性能分析工具,能实时采集 Lua GC、Mono GC、函数耗时与调用次数,覆盖编辑器与 Android 真机两大场景。如果你正被"Lua 内存越跑越高、卡顿说不清在哪"困扰,这篇保姆级实战文章会带你从安装到定位泄漏一次走通。
当 Lua 开始卡顿和涨内存
很多团队把业务逻辑塞进 Lua 后,会逐渐撞上两个"玄学":内存曲线悄悄爬升、帧率偶发性跌到个位数。前者多半是对象没释放干净,后者往往是某个函数偷偷干了重活。想定位它们,光靠 print 打点远远不够,你需要一份"体检报告":谁在申请内存、谁在消耗时间、又被谁调用。
Miku-LuaProfiler 解决的正是这件事。它通过 hook 技术接管 Lua 的内存申请与关键调用,把每个函数的 Lua GC、Mono GC、耗时、调用次数一五一十记下来,再以曲线图和明细表呈现,让你从"凭感觉优化"变成"看数据说话"。
5分钟装好:两个安装入口任选
安装不难,二选一即可:
- 推荐:Unity 2019 及以上,直接用 Package Manager 按 Git 地址添加,拉取即完成;
- 兼容:Unity 5.6 以上,执行
git clone https://gitcode.com/gh_mirrors/mi/Miku-LuaProfiler拉取项目后,把 LuaProfiler 目录整体复制进 Assets。
装好后,编辑器菜单出现 Lua Profiler 相关入口,就算安装成功 ✅。
第一份报告:编辑器里跑通 Lua 性能分析
安装完成,打开 Profiler 窗口,推荐先用local 模式:不连真机,直接在编辑器里跑游戏就能采集数据,这是上手成本最低的路径。
跑起来后会看到这样的界面:上方是内存与耗时的趋势曲线,下方是函数明细表,每一列都可排序。点表头按 totalLuaMemory(函数累计产生的 Lua GC)或 totalTime(累计耗时)降序,排最前面的就是最值得优化的对象。
想看某个时间段的波动,可以切到Record 模式重跑一遍:在关键操作处点 StartRecord 采样,再用时间轴截取内存明显上涨的片段,逐帧看是哪个函数在"偷内存"。鼠标悬停图表后按键盘左右键即可切换采样点,非常顺滑。
真机实测:把手机变成数据源
编辑器数据再漂亮,也比不上真机真实。Android 真机打通分三步:
- 打包时加上
USE_LUA_PROFILER宏,并把libmiku_hook.so插件一并打进包内; - 首次启动前,在手机的 persistentDataPath 目录下创建
need_hook_miku_lua标记文件(用后自动删除,需要时重新创建); - 手机与电脑连同一网络,窗口切到 remote 模式填入手机 IP,实时数据即刻上屏。
如果公司网络不允许直连手机 IP,也有救:用 USB 线连接后执行adb forward tcp:2333 tcp:2333,IP 栏填127.0.0.1即可打通通道,一样能看到数据。
进阶:用内存快照揪出 Lua 内存泄漏
排查泄漏是这套工具最值钱的能力,思路很像"对比照片":先拍一张,再拍一张,最后找差异。对应到工具就是三个按钮:MarkStaticRecord(快照一)、MarkLuaRecord(快照二)、DiffRecord(对比)。
实操范例:打开某个 UI 前 MarkStaticRecord;打开并操作一番后 MarkLuaRecord;调用 UI 释放逻辑后再 DiffRecord。凡是"打开前没持有、打开后持有、释放后仍持有"的对象,基本就是泄漏点。C# 侧持有的 Lua 委托泄漏也能靠 Ref 列表查出来——每次开 UI 前清空数据,关闭后再看残留回调还剩多少,一目了然。
另外别忘了一个提速小技巧:在搜索框输入[lua]再点 merge,就能把 Lua 侧数据合并起来按任意指标排序,快速锁定内存暴涨的元凶。
避坑清单:新手最容易卡住的5个点
- 数据全是负数:Lua GC 统计基于虚拟机内存总量差值,采样途中发生 GC 会算出负值,可先关掉自动 GC 再统计;
- 真机只有 resume/协程数据:别用 luac 加密代码,改用明文字符串即可;
- DeepLua 打开后空异常报错:采样代码与 debug.getupvalue 冲突所致,可改用按名字遍历取值的方式规避;
- 调用了 luaGC 却无效:工具已接管 GC 函数,内存增长到上次 GC 的约 1.2 倍会自动触发,属正常现象;
- 真机莫名闪退:多半是 hook dlopen 被系统限制,可在工程里实现 ILuaCustomSetting 显式指定 Lua 库路径。
更多细节与界面说明,都收录在项目 doc~ 目录和 README 的 FAQ 里,卡住时随手可查。
从"会看"到"会优化"
跑通一遍你就会发现,Lua 性能优化的瓶颈往往不在语言本身,而在那些看不见的隐藏分配和未释放的引用。数据不会说谎,优化自然就有了方向。
下一步建议:把工具接入项目日常构建,每周用快照对比做一次"内存体检",把泄漏消灭在发布之前。祝你的项目跑得又快又稳 🚀
【免费下载链接】Miku-LuaProfiler项目地址: https://gitcode.com/gh_mirrors/mi/Miku-LuaProfiler
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考