大家如果做了优化,或者注意过profile应该都会关注到一个内存问题,静态引用“managedstaticreferences”。
。如果第一次遇到他,确实是一个可怕的家伙。你没办法定位他的错误位置,只会显示这一串英文给你看。
然后上网看了很多解决办法都是在说跟static里面的变量相关。
于是我一开始会关注到代码里面的静态变量,也包括单例。但我发现就算我把静态变量去掉,单例去掉其实还是有
这个出现。
非常崩溃!
于是我就关注到他显示的静态引用的堆栈,比如这个
可以看到他的对战时关于LTInstanceWallObj。然后可以看多几个堆栈,其实都时跟这个相关。所以我就从LTInstanceWallObj着手看看究竟会是怎么回事。
但其实代码很简单,而且更致命的是没有任何静态变量或单例之类的。
非常崩溃!
然后我们再看看他堆栈上,这个静态引用有什么内容

这个内容跟在prefab上的
相关。
于是我尝试把floor和wall的引用去掉,我自己来加载


其中GetAssetSync中是通过两种方式执行
如果是editor下则直接用AssetDatabase.LoadAssetAtPath执行,如果是AB包则用assetBundle.LoadAsset执行。(一般不建议放到resource下)
然后就是卸载了,如果destroy该界面就要执行卸载了。但我放在了Disable执行

这里是做了两个行为,如果是ab包则执行assetBundle.Unload并把记录的字典去掉,如果是editor下的直接设置为null就好。
最终这个静态引用不存在了。

其他的实现也要类似执行
本文深入探讨了解决Unity中ManagedStaticReferences内存问题的方法。通过分析堆栈信息,作者发现即使没有静态变量或单例,问题也可能出现在prefab资源的加载和卸载过程中。文章详细介绍了如何通过自定义资源加载和正确卸载来消除此内存问题。

1344

被折叠的 条评论
为什么被折叠?



