当前位置: 首页 > 工具软件 > lua-gd > 使用案例 >

Unity lua内存泄漏与性能检测

皮骏
2023-12-01

上周UWA发表了一片博文Lua性能优化—Lua内存优化作者分享了在unity中lua使用的不少干货,文中提到两个lua的小插件,一个是内存检查工具Snapshot,一个是性能分析工具LuaProfiler。
正好上周笔者也涉猎到了这方面的实践上,作为记录我将操作步骤分享下。
1.首先Snapshot是云风大大曾经的一篇博文提到的工具一个 Lua 内存泄露检查工具
2.其次Profiler也是云风大大的工具一个简单的 Lua 性能分析工具
3.还有帮助我能顺利集成以上两个工具的不可缺少的一篇文章Unity手游开发札记——ToLua#集成内存泄露检查和性能检测工具
4.最后不缺少的就是ulua/tolua编译方法ulua底层库&Mingw编译工具下载
百度网盘下载地址:http://pan.baidu.com/s/1gd1Wyx9
笔者已经测试此方法ulua/tolua都可以编译
如果功底比较好的同学可以直接查看以上超链接自己集成,本文以ulua为例子小白向的带着大家一步一步将功能做完

一、资源目录结构分析

建议解压下载文件放在D盘
公共资源
编译工具
D:\MinGW\x32\msys\1.0\msys.bat
D:\MinGW\x64\msys\1.0\msys.bat
分别是编译32和64对应平台ulua/tolua库的工具
ndk
根据文档下载好,配置好ndk的环境变量
ulua
D:\ulua\BuildWin\Source目录下有几个重要的编译脚本build-win32.sh、build-win64.sh分别是编译32和64对应平台的ulua.dll,使用上述编译工具执行脚本便可
D:\ulua\BuildWin\Source\android\jni目录下build_arm.sh、build_x86.sh
D:\ulua\BuildMac 是MAC和IPhone的编译工程需要在mac下执行编译
tolua
D:\tolua目录下几个脚本build-win32.sh、build-win64.sh、build_arm.sh、build_x86.sh可直接执行编译
D:\tolua\iOS 是ios的对应工程
上述文件执行完毕会在Plugins目录下生成对应的库

二、集成snapshot

ulua src目录位置D:\ulua\BuildWin\Source\luasocket\src
tolua src目录位置D:\tolua\luasocket
直接添加打src目录将build-win64.sh中也添加snapshot.c的代码

    luasocket/src/except.c \
    luasocket/src/select.c \
    luasocket/src/wsocket.c \

    luasocket/src/snapshot.c \

执行编译,将得到对应的lua库,将lua库放到unity工程中,如果你们没有修改lua的一些接口直接使用下面的方法就可以对比内存快照,打印内存增量

-- Lua内存记录功能
local preLuaSnapshot = nil
local function snapshotLuaMemory(sender, menu, value)
    -- 首先统计Lua内存占用的情况
    print("GC前, Lua内存为:", collectgarbage("count"))
    -- collectgarbage()
    -- print("GC后, Lua内存为:", collectgarbage("count"))

    local snapshot = require "snapshot"
    local curLuaSnapshot = snapshot.snapshot()
    local ret = {}
    local count = 0
    if preLuaSnapshot ~= nil then
        for k,v in pairs(curLuaSnapshot) do
            if preLuaSnapshot[k] == nil then
                count = count + 1
                ret[k] = v
            end
        end
    end

    for k, v in pairs(ret) do
        print(k)
        print(v)
    end

    print ("Lua snapshot diff object count is " .. count)
    preLuaSnapshot = curLuaSnapshot

end

如果你们执行require “snapshot”有问题,那么添加几段c#代码
LuaDLL.cs

        [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern int luaopen_snapshot(IntPtr luaState);

LuaScriptMgr.cs

       LuaDLL.luaopen_snapshot(lua.L);
       LuaDLL.lua_setfield(lua.L, -2, "snapshot");

手动在c#中require “snapshot”这个类

 类似资料: