上周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”这个类