Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第一次快照unity会卡死 #5

Open
tianmao888sdo opened this issue Oct 16, 2018 · 11 comments
Open

第一次快照unity会卡死 #5

tianmao888sdo opened this issue Oct 16, 2018 · 11 comments

Comments

@tianmao888sdo
Copy link

不好意思,内网无法截图,我只能手写了。以下是我的调用
local mri=require 'common.utils.MemoryReferenceInfo'

if Input.GetKeyDown(KeyCode.U) then
collectiigarbage("collect")
mri.m_cMethods.DumpMemorySnapshot("./","1-Before",10)
elseif Input.GetKeyDown(KeyCode.I) then
collectiigarbage("collect")
mri.m_cMethods.DumpMemorySnapshot("./","2-After,10)
elseif Input.GetKeyDown(KeyCode.O) then
mri.m_cMethods.DumpMemorySnapshotCompareFile("./","Compared",10,"./LuaMemRefInfo-All-[1-Before].txt","./LuaMemRefInfo-All-[2-After].txt"
end
我用的是Slua,对应lua版本5.1,手写输入难免不,但大致是这么写的,我是完全参考你的事例程序这么用的。只要一按U键,立刻屏幕,所有操作都会卡死,也不生成文件(其实到现在我都不知道文件会生成在什么地方)

@tianmao888sdo
Copy link
Author

参数我一开始选的都是-1,但我以为是测试的对象太多了,所以就填成10了,也没用

@yaukeywang
Copy link
Owner

1.你无论如何都不要在具体项目中使用 "./" 这样的相对路径,我示例中这么写是为了方便保存在当前路径下,slua 或者 ulua 等环境不一样,也会存在读取权限的问题,恐怕你自己都不知道 "./" 会保存到哪里;你应该自己去合并一个明确的路径才对,比如:Application.persistentPath + "/LuaSnapshot/" 或者 Application.dataPath + "/LuaSnapshot/" 类似非常明确的路径才对;

2.mri.m_cMethods.DumpMemorySnapshotCompareFile 中也是一样,显示的传入文件夹路径和文件路径,你修改试试。

@tianmao888sdo
Copy link
Author

非常谢谢啊,头一次见到你这么积极回复的博主。昨天我已经猜测出来问题所在了。其实不只是你这个工具,就算是风云写的snapshot工具,我加入到slua.dll重新编译,然后加入全局变量中。当我在lua内用snapshot函数快照时,如果快照的时候是我自己测试的一个对象,因为内容很少,所以很容易就打印出来了。但是当我进入游戏大场景,再调用就会直接卡死,跟用你的工具现象是一样的。所以我暂时怀疑可能是我游戏场景中的临时内存太多了吧

@tianmao888sdo
Copy link
Author

所以我在想,会不会存在监控的变量太多了导致卡死的因素?

@yaukeywang
Copy link
Owner

这个比较奇怪了,你的 lua memroy 得多大,一般10M以下,5M左右正常,我曾经遇到过因为泄露100M的lua memroy,打印快照也是很快没有死过的情况,不知道你的情况,你需要看看 collectgarbage("count") 的数值,如果这个数值太夸张,比如甚至大于 100M,就得考虑你项目对于lua的使用是不是有什么问题。如果你有数据尽量贴过来帮你看看。

@tianmao888sdo
Copy link
Author

我们的项目确实特别大,超大场景无缝地图,还有引擎配合,各种绚丽的shader,场景元素非常庞大。在登录界面,我collectgarbage("count")得到的结果是42525左右,这个时候已经有点卡了。到了场景中,得到的值内存值为180000到380000左右,一直卡死

@tianmao888sdo
Copy link
Author

我们项目之前确实存在内存泄露,就在那一直开着不动,unityproflier看不出来,但从任务管理器上看unity,内存一直在慢慢增长。因为之前都是做功能,一直没重视优化这块,所以现在要出包了,我就被要求做优化工具的研究。感觉你这个和风云那个都挺好,但唯独卡这个事我不知道怎么回事。其实我想如果能减少监控的数目,能不能做到筛选,让工具运行更顺畅一些
我们的场景有大量的本地树木,采集物,交互物,还有大量的npc,怪物,可能是引擎动态刷出来的,也有服务器指挥创建的,引擎本身就站了很多内存了。暂时我只想监控lua层面到c#层面资源的内存使用情况和lua临时变量过多导致的内存问题

@tianmao888sdo
Copy link
Author

现在的问题是,先不考虑内存泄露,我得先找到哪些临时的内存占用了这么多的内存,如果这个不解决,就算没有内存泄露,它平时的正常状态也会占用过多内存

@yaukeywang
Copy link
Owner

这个没办法,你的虚拟机内存太大了,几百兆,不过也不至于所有操作卡死,顶多unity会卡一会儿,生成过程没那么慢,可能你触发了什么访问权限的东西被系统阻止,你首选确认修改了我上面说的生成路径,应该是你项目的问题。DumpMemorySnapshot 接口最后有两个默认参数,不填的话是打印 debug.registry,你可以显示指定,比如:
mri.m_cMethods.DumpMemorySnapshot("./", "1-Before", -1, "_G", _G),只打印 _G 的引用,你可以换成更小的对象试试。

@yaukeywang
Copy link
Owner

至于过滤,你可以自己去修改CollectObjectReferenceInMemory这个接口,按照自己需求修改即可,比较简单。

@stillcold
Copy link

我也同时试了云风的版本和这个版本,我的collectgarbage("count")大约在500M左右,云风的可以生成出来,这个版本不知道为啥也卡了~不是系统权限的原因,还没到输出的逻辑,卡在collect阶段

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants