Deploy and Install
Tutors
Datas Descriptions
Record mode
DIFF two different periods of Lua variables
On-device Profiler
Contact
Unity + Lua script is now most popular incremental update frameWork for mobile game in China,However, since there haven't been good tool to monitor the cpu and memory usage of lua vm, lots of developers have no idea to optimize their code,so there are many potential risks in lua codes.
this tool is designed to support an easy-to-use profiler for Unity that help finding bottleneck and make your game more fast and stable.
Lua Profiler For Unity supports XLua、SLua、ToLua and also a remote profiler tool so it supports Windows、Android、IOS On-device Profiler.
- You must open two Unity projects,one for game client ,one for editor server
- Open LuaProfiler folder
- Copy LuaProfilerClient folder to you game project content,if your C# Lua script is in Plugins folder,Copy LuaProfilerClient to Plugins.This Tool must make sure That code must in the same DLL which has C# lua codes.
- Use Unity5.6 or newer version Unity version to open LuaProfilerServer as a Unity project
- If your Unity version is below 5,call the following code before start the game.
MikuLuaProfiler.HookLuaSetup.OnStartGame();
It use mono.ceil's IL inject feature(also use in XLua),inject the profiler code to game code
Open windows by "Window->Lua Profiler Window", toggle profiler's feature and configure the server ip address.
Select the kind of code you want profiler,C# code color is green,and lua code color is blue.
Also open windows by "Window->Lua Profiler Window", then click OpenService,wait for client connects
Name | Descriptions |
---|---|
Overview |
function name |
totalLuaMemory |
The sum of all Lua GCs produced by this function If GC happens then the value will not be very accurate |
self |
The amount of GC produced by the function itself |
totalMonoMemory |
The sum of all Mono GCs produced by this function If GC happens then the value will not be very accurate |
self |
The amount of GC produced by the function itself |
currentTime |
The time it takes for the function to run in current frame |
averageTime |
Count the average value of the time spent on the function |
totalTime |
All the time consumed by this function |
LuaGC |
Lua GC generated by the current frame |
MonoGC |
Mono GC generated by the current frame |
totalCalls |
The number of runs of this function after the game starts |
Calls |
The number of executions of the current frame of the function |
Press DEL
or touch four fingers
in screen to show this menu,you can change ip to connect and show more details of profiler info
Programmers tend to forget to release Lua objects that are cached by C#.For example, when XLua calls LuaEnv.Dispose, it throws the exception "try to dispose a LuaEnv with C# callback!"
The reason is often caused by the following code
LuaTable tb = ...
Action action = tb.rawget<Action>("action");
a();
tb.Dispose(); //This line of code tends to forget to call
a= null; //This line of code tends to forget to call
in Lua
// The lua table tends to forget to call dispose
CS.UIBehaviour.luauiTable = {}
// The callback tends to Unregister
CS.UIButton.OnClick = function() print("test") end
They can be released by C#'s destructor, but because in C# is just an index, the memory footprint is small then C# will not be GC immediately, but the memory usage on Lua is very large.
This tool will provide real-time detection of the registry to help locate memory leaks quickly.
You can search history in record line
You can set index '__name' to the lua table,monitor will replace the table code by the value of this index
CS.UIBehaviour.loginUI = { __name = "LoginUI" }
- Toggle
LuaChart
to open lua memory chart,line color is blue. - Toggle
MonoChart
to open mono memory chart,line color is green. - Toggle
FpsChart
to open fps chart,line color is orange. - Toggle
PssChart
to open pss chart,line color is red. - Toggle
PowerChart
to open power chart,line color is brown.
Click Record button, when game connect to server, toggle StartRecord to start or stop record.
- drag slider to modify samples
- click '<' 、 '>' to increase or discrease frames one by one
- click '<<' 、 '>>' to fast locate the frames control by Capture Lua GC、Capture Mono GC、Frame Count
- stop record and press left or right arrow keybord to increase or discrease frames one by one
Choose an appropriate time, such as you are ready to open a new UI after the configuration table is loaded, click MarkLuaRecord button
Open the UI then close and unload the UI resources. Click DiffRecord. The tool will compare the difference between the Lua variable at the time of Mark and the variable when you click DiffRecord.
Clicking the ShowLog button will save the type of the variable and the reference path after the file is saved. Note that _G represents the global table and _R represents the object referenced by C#.
Destroy null values for Unity has released resources, while Lua still references variables, this is the main resource leak to focus on.
Set macro USE_LUA_PROFILER to inject profiler code in you App.
set IP:127.0.0.1 port:2333. Connect your android phone with a USB cable.Execute the following instructions in cmd windows.
adb reverse tcp:2333 tcp:2333
Execute your app.
If you want to use luac code or luajit bytecode ,use InjectLua.exe in folder tools To inject the lua profiler code.
InjectLua.exe "inpath" "outpath"
If you find any bug or have any suggests join the QQ group:882425563 to contact us
部署和安装
使用教程
数据说明
记录模式
DIFF 两个不同时期的Lua变量
真机profiler
联系我们
Unity + Lua 脚本现在是**最流行的增量更新框架,但是,由于没有很好的工具来监控lua vm的cpu和内存使用情况,很多开发人员都不知道如何优化他们的代码,所以在lua代码中存在许多潜在的风险。 此工具旨给Unity 提供一个易于使用的lua性能分析器用于查找代码中的性能瓶颈并使您的游戏更快速、稳定。
Lua Profiler For Unity支持 XLua、SLua、ToLua ,本工具是基于远程Socket的Profiler工具,因此它支持Android,IOS 的真机 Profiler。
- 您必须打开两个Unity项目,一个放进游戏客户端,一个用于展示数据
- 打开 LuaProfiler 文件夹
- 将 LuaProfilerClient 文件夹复制到游戏项目内容,如果您的C#Lua脚本位于Plugins文件夹中,则将 LuaProfilerClient 复制到插件。此工具必须确保该代码必须位于具有C#lua代码的同一DLL中。
- 使用 Unity5.6 or newer version Unity版本将 LuaProfilerServer 作为Unity项目打开
- 如果Unity版本低于5,请在开始游戏前调用以下代码。
MikuLuaProfiler.HookLuaSetup.OnStartGame();
它使用mono.ceil的IL注入功能(也用于XLua),将profiler代码注入游戏代码
通过**"Window->Lua Profiler Window"**打开设置窗口
选择想要分析器的代码类型,C#代码颜色为绿色,lua代码颜色为蓝色。
同理可以通过 Window->Lua Profiler Window打开窗口,然后单击 OpenService,等待客户端连接
Name | Descriptions |
---|---|
Overview |
函数名称 |
totalLuaMemory |
此函数生成的所有Lua GC的总和 |
self |
函数本身产生的GC量 |
totalMonoMemory |
此函数生成的所有Mono GC的总和 |
self |
函数本身产生的GC量 |
currentTime |
函数在当前帧中运行所需的时间 |
averageTime |
计算在函数上花费的时间的平均值 |
totalTime |
此功能消耗的所有时间 |
LuaGC |
由当前帧生成的Lua GC |
MonoGC |
由当前帧生成的Mono GC |
totalCalls |
游戏开始后此功能的运行次数 |
Calls |
函数当前帧的执行次数 |
按 DEL
或 四手指触碰屏幕 以显示此菜单,您可以在游戏中随时中断或者重启连接 以及更换IP地址
程序员往往忘记释放由C#缓存的Lua对象。例如,当XLua调用LuaEnv.Dispose时,它会抛出异常 "try to dispose a LuaEnv with C# callback!"
原因通常是由以下代码引起的
LuaTable tb = ...
Action action = tb.rawget<Action>("action");
a();
tb.Dispose(); // 忘记Dipose了
a= null; //忘记置空变量了
在Lua
// 忘记置空变量了
CS.UIBehaviour.luauiTable = {}
// 忘记取消注册函数了
CS.UIButton.OnClick = function() print("test") end
它们可以被C#的析构函数释放,但是因为在C#中只是一个索引,内存占用很小,所以C#不会立即成为GC,但是Lua上的内存使用量非常大。此工具将提供对注册表的实时检测,以帮助快速定位内存泄漏。
您可以将索引'__name'设置为lua表,monitor将使用此索引的值替换表代码
CS.UIBehaviour.loginUI = { __name = "LoginUI" }
- 点击
LuaChart
打开lua内存图表,线条颜色为蓝色。 - 点击
MonoChart
打开单声道内存图表,线条颜色为绿色。 - 点击
FpsChart
打开fps图表,线条颜色为橙色。 - 点击
PssChart
打开pss图表,线条颜色为红色。 - 点击
PowerChart
打开电量图表,线条颜色为棕色。
单击 Record 按钮,当游戏连接到服务器时,切换 StartRecord 以开始或停止录制。
- 拖动滑块以修改样本
- 单击 '<' 、 '>' 逐个增加或减少帧
- 单击 '<<' 、 '>>' 以快速定位 Capture Lua GC、Capture Mono GC、Frame Count
- 停止记录并按左或右箭头键盘逐个增加或减少帧
选取一个适当的时机,比如配置表加载完后,准备打开一个新的UI的时候点击MarkLuaRecord按钮
打开UI然后关闭并卸载掉UI资源,点击DiffRecord,工具将会对Mark时候的Lua变量与DiffRecord时候的变量进行差异比较
点击ShowLog按钮,将会把文件存盘打开之后将把对于变量的类型以及引用路径打印出来。 注意_G表示全局表,_R表示被C#引用的对象
Destroy null values为Unity已经将资源释放,而Lua仍然引用的变量,这个是主要的资源泄漏要重点关注。
设置宏 USE_LUA_PROFILER 以在App中注入探查器代码。
设置IP:127.0.0.1 port:2333. 。使用USB线连接Android手机。在cmd窗口中执行以下指令
adb reverse tcp:2333 tcp:2333
执行你的应用程序。
如果要使用luac代码或luajit字节码,请在文件夹工具中使用InjectLua.exe注入lua profiler代码。
InjectLua.exe "inpath" "outpath"
easy66
Xavier
Jay
ZhangDi
and all members in qq group LuaProfiler
如果您发现任何错误或有任何建议加入QQ群:882425563 与我们联系