新功能!Lua,是时候和你走走心了!

新功能!Lua,是时候和你走走心了!

目前,Lua已经俨然成为了各大研发团队中实现代码热更新功能的标配方案。它方便灵活,对于项目中增加功能和修复Bug非常方便。然而,随着Lua在项目中的大量使用,它所带来的性能问题也逐步成为了项目运行时的重大性能瓶颈之一。特别是内存相关的性能问题,无论是内存分配过大还是内存泄露无法回收,目前都已经在不少研发项目中集中爆发。

为此,我们今天在UWA GOT中推出Lua的内存深度检测,凡是已购买了UWA GOT Online服务的用户,可通过真机测试后将测试数据上传至UWA官网分析,即可查看Lua内存的检测报告。

请输入图片描述

目前的版本已经支持了较为主流的uLua、ToLua、SLua 和xLua。若研发团队将Lua的Native库重编译成自定义名字,可通过UWAEngine.SetOverrideLuaLib接口来指定库名。Lua内存检测目前分为三个部分:总体堆内存、堆内存具体分配和Mono对象引用,下面我们将逐一介绍。


1、总体堆内存

该页面记录了Lua的总内存走势以及Lua中几种重要对象的数量:Table,Userdata和Function(由于通常情况下thread的数量较少且稳定,因此这里不再显示)。

请输入图片描述

如上图所示,我们可以清晰地查看项目运行至某一帧时的Lua内存占用,从而评估该数值是否符合预期,是否存在内存泄漏的风险。


2、堆内存具体分配

该页面便于研发团队定位Lua堆内存分配较多的函数,我们可以查看这些函数在任意一帧的具体分配堆栈,帮助用户优化Lua的堆内存分配,降低Lua GC的触发频率和触发时的开销。

请输入图片描述

注:Lua函数的命名格式为X@Y:Z,其中X是其函数名,在无法获取时,X会变为默认的unknown;Y是该函数定义的文件位置;Z则是该函数被定义的结束行号。需要注意的是,当Lua脚本以字节码运行时,该值将始终为0,因此建议在测试时尽可能使用Lua源码来运行。

同时,效仿之前的Mono堆内存倒序分析功能,在Lua的堆内存中我们同样可以这样查看。只需要切换查看方式,我们就可以直观地定位到底哪一个Lua脚本中的哪一行代码在分配大量堆内存。这样,研发团队就能直接打开对应的Lua脚本,找到那一行和函数直接修改,优化从此变得如此简单。

请输入图片描述


3、Mono对象引用

在任意一种Lua插件中,都存在类似的机制:在C#层维护一个Cache来引用那些被Lua访问过的C#层对象,防止出现以下的问题:当Lua中再次访问该C#对象时,该对象可能已经被C#层的GC回收掉了,从而导致逻辑错误。所以,在Lua中始终保留某个C#层对象的引用,将会导致其无法被释放,当这样的引用越来越多,就会导致C#层的内存泄漏。

为了便于用户排查这种情况,我们在Mono对象引用的报告页面中对上述的Cache中C#层对象进行了汇总,统计了Cache中出现的对象类型和各个类型的对象总数。当该对象继承自UnityEngine.Object时,还将统计该类型中已经被Destroy的对象数量,如下图所示:

请输入图片描述

点击上图的每个对象类型,可以查看它们的总数变化。对于某些数量持续上涨的对象类型,可以通过对比两个不同采样点的对象引用,从而进一步定位Lua中不合理的引用。

请输入图片描述

这次的Lua内存深度检测小编就安利到这里啦,关于CPU性能分析的功能我们也会在后续推出,力求为开发者提供更多支持,欢迎关注!

友情提示:Lua内存检测服务目前仅在UWA GOT Online中提供,同时需要大家更新使用的SDK哦!黑科技的大刀快耍起来!


关于UWA GOT Online

UWA GOT 是UWA推出的本地性能测评工具,它方便研发团队在本地真机测试,并能在编辑器中搭建本地服务器查看性能数据。现在,在UWA GOT现有的本地测评模式上,我们增加了线上同步和分析功能,研发团队可以将本地测评的数据快速同步到UWA官网,生成在线测评报告,提供更高效的性能分析数据及有针对性的优化建议。同时,贴心的版本对比功能,方便研发团队轻松监测每次测试中的重要性能参数变化趋势,从质量管控上为项目的研发保驾护航。

  • Techniques for Game Development 55 发表在 6月8日 回复

    [...]Q2: I use UWA GOT Online to check the Lua memory, and you can also refer to this article: https://blog.uwa4d.com/archives/UWAGOTOL_LuaMemory.html[...]