大家如果做了优化,或者注意过profile应该都会关注到一个内存问题,静态引用“managedstaticreferences”。。如果第一次遇到他,确实是一个可怕的家伙。你没办法定位他的错误位置,只会显示这一串英文给你看。
然后上网看了很多解决办法都是在说跟static里面的变量相关。
于是我一开始会关注到代码里面的静态变量,也包括单例。但我发现就算我把静态变量去掉,单例去掉其实还是有这个出现。
非常崩溃!
于是我就关注到他显示的静态引用的堆栈,比如这个
可以看到他的对战时关于LTInstanceWallObj。然后可以看多几个堆栈,其实都时跟这个相关。所以我就从LTInstanceWallObj着手看看究竟会是怎么回事。
但其实代码很简单,而且更致命的是没有任何静态变量或单例之类的。
非常崩溃!
然后我们再看看他堆栈上,这个静态引用有什么内容
这个内容跟在prefab上的相关。
于是我尝试把floor和wall的引用去掉,我自己来加载
其中GetAssetSync中是通过两种方式执行
如果是editor下则直接用AssetDatabase.LoadAssetAtPath执行,如果是AB包则用assetBundle.LoadAsset执行。(一般不建议放到resource下)
然后就是卸载了,如果destroy该界面就要执行卸载了。但我放在了Disable执行
这里是做了两个行为,如果是ab包则执行assetBundle.Unload并把记录的字典去掉,如果是editor下的直接设置为null就好。
最终这个静态引用不存在了。
其他的实现也要类似执行