toLua Framework之性能检测与优化

 

前言

toLua Framework是一款开源的Unity+toLua热更新框架,越来越多的游戏项目将其应用于热更新开发,但这样会形成了Lua+Mono双GC系统,而有的开发人员优化时往往只针对Mono层的优化而忽略Lua层的性能问题,或者没有类似于Unity Profiler这样高效直观的优化工具,又或者认为Lua拥有类似于C#的垃圾自动回收机制而不必优化。其实,Lua使用不规范也会造成灾难性的性能问题。

例图:Unity Profiler只能追踪到C#层与Lua层的交互代码块,而无法具体分析Lua层

toLua Framework之性能检测与优化_第1张图片

 

性能问题

  • Lua层大量内存分配会导致频繁的LuaGC从而造成卡顿,这一点跟C#一样。
  • C#和Lua频繁地互相调用存在性能损耗。
  • Lua对象如果是全局变量会直接放在_G中,LuaGC无法清除。
  • Lua对象被一些全局的Table引用,LuaGC无法清除。
  • C#和Lua的互相引用,使用完未处理导致引用依然存在然后都GC不掉的情况,如Lua对象的function字段被赋值给了C#的事件/委托。
  • Lua层配置表内存占用过大。

参考资料:
https://www.jianshu.com/p/19f03570a117
https://blog.uwa4d.com/archives/USparkle_Lua1.html
https://blog.uwa4d.com/archives/2037.html

 

 

检测工具


LuaProfiler

1. LuaProfiler

简述:有点年代的官方产品,可以统计出包括代码执行次数、平均时长、总时间消耗在内的更多信息,更多详情可以点击官方介绍查看。

官网下载地址:http://luaprofiler.luaforge.net/index.html#download

GitHub地址:https://github.com/luaforge/luaprofiler

其他下载地址:https://www.cnblogs.com/lightsong/p/5576100.html

使用手册:http://luaprofiler.luaforge.net/manual.html

源码解析:https://www.jianshu.com/p/f6606b27e9de

toLua Framework集成:https://www.jianshu.com/p/19f03570a117


2. 云风的LuaProfiler

简述:比较简单 Lua 性能分析工具,注意的是很多函数都是Lua 5.2和Lua 5.3版本之后才有的函数。

GitHub地址:https://github.com/cloudwu/luaprofiler

toLua Framework集成:https://www.jianshu.com/p/19f03570a117

 

Lua内存分析工具

1. 云风的Snapshot

简述:比较简单的一个Lua内存分析工具,通过对比代码段执行前后全局变量的快照进而排查Lua对象是否存在泄露。

博客地址:https://blog.codingnow.com/2012/12/lua_snapshot.html

GitHub地址:https://github.com/cloudwu/lua-snapshot

toLua Framework集成:https://www.jianshu.com/p/19f03570a117


2. Luacheck

简述:网上一个Lua检查工具,还没研究过,功能很多。

使用手册:https://luacheck.readthedocs.io/en/stable/

GitHub地址:https://github.com/mpeterv/luacheck


3. LuaMemorySnapshotDump

简述:从Lua的Registry或者_G开始往下递归查找,找到所有为null userdata的对象(null userdata,在toLua方案中表示是一个C#对象,并且Equals null),并且可以反向列出该对象的引用链,直到Registry或_G为止。这样就可以详细的定位是哪个Lua对象造成了问题。

博客地址:https://www.cnblogs.com/yaukey/p/unity_lua_memory_leak_trace.html#4313499

GitHub地址:https://github.com/yaukeywang/LuaMemorySnapshotDump

 

LuaProfiler-For-Unity

简述:大神们写的一款类似于Unity Profiler的Lua调试利器,可以将C#和Lua的整个函数调用过程展示在你面前,并且支持真机调试。

博客地址:https://www.zhihu.com/question/307064711/answer/570257565

使用教程:https://zhuanlan.zhihu.com/p/57051520

下载地址:https://github.com/ElPsyCongree/LuaProfiler-For-Unity或https://gitee.com/Sziye/LuaProfiler-For-Unity#installe_zh

界面展示:

toLua Framework之性能检测与优化_第2张图片

 

 

优化建议

  • 尽量使用局部变量,以让没用到的Lua对象被及时LuaGC。
  • 使用内存池提高内存复用率,降低内存分配速度。
  • 不要将Lua匿名函数注册给C#的代理,C#那边的LuaFunction要及时Dispose掉。
  • 避免Lua与C#之间字符串的频繁传递,存在性能损耗。
  • 避免在Lua这边使用Vector3计算位移,C#那边是个栈对象,Lua这边是个堆对象,会导致Lua的频繁GC。
  • 慎用string.gsub和string.gmatch,它们会产生大量字串。
  • 使用table.concat代替“..”来拼接字符串,后者每次都会产生一串新的字符串。
  • 优化配置表,对规律性的数据或冗余的无用数据进行压缩存储,点击查看压缩方案。

参考资料:
https://blog.uwa4d.com/archives/2037.html
https://blog.uwa4d.com/archives/usparkle_luaperformance.html
https://www.zhihu.com/question/307064711/answer/570257565
 

你可能感兴趣的:(toLua,Unity,性能优化)