1)为什么Profiler中看到的纹理内存比实际占用大
2)为什么Hidden Shader占用两份内存开销
3)在Destroy前,需要把所有Texture引用都释放掉吗
4)ManagedHeap.UsedSize占用内存过大问题
这是第411篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。
UWA社区主页:community.uwa4d.com
UWA QQ群:793972859
Memory
Q1:我在编辑器Profiler中看到很多纹理都是实际大小2倍还多,这是什么原因?
A1:编辑器的性能分析工具不准是正常的,内存和耗时都要以真机测试为准。
Q2:但是我们的项目就只有PC的,如何做真机测试呢?
A2:PC也是有真机的,打包以后运行exe文件,再连接工具分析。
该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6743f61f3d306f3e9d594da4
Memory
Q:请问下图这部分Hidden Shader占用两份内存开销是什么原因?
比如说两份UberPost,看起来没有Editor:
或者说有没有可能是因为加载了两次PostProcessData导致的?因为我看两份占用中每份都会引用一个PostProcessData。
A:可以检查下是否在Graphics-Always Included Shaders中有一份或者首场景有对象引用,然后又从AssetBundle里加载了一份。
该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6743efb0682c7e5cd61bf99f
Memory
Q1:如下图,有一个Texture被引用三次,我要删除的时候就得把这三个引用都释放掉再Destroy吗?
A1:new几次,就Destroy几次,引用可以无视。引用处会变成空图片效果。
感谢jump晃悠@UWA问答社区提供了回答
Q2:那他不会因为还有引用而导致Destroy失败吗?
A2:可以Destroy一个还在显示的试试看。
感谢jump晃悠@UWA问答社区提供了回答
Q3:对Destroy这个方法还有点疑惑,我现在Destroy一个Texture,但是Material没释放,这个Texture在Profile还是存在没被释放掉,如下图:
是不是在还有引用计数的情况下,最后Destroy会失败?
A3:Material看你是引用的Asset的Mat还是自己修改后生成的Instance,如果是Instance你要自己手动负责释放。
感谢小波@UWA问答社区提供了回答
Q4:我们没有本地Asset,都是通过数据加载实例化出来的,Material、Texture、Mesh都是实例化出来的,所以这三个我都要Destroy掉吗?
A4:如果你是Prefab这种实例化出来,只要Mat你没有修改过,或者你引用过导致他实例化出来,那你就不用单独Destroy,如果你Mat是new出来的,你肯定要Destroy。
感谢小波@UWA问答社区提供了回答
Q5:所以如果我只要Destroy贴图没有Destroy Mat,那我的贴图就不会被Destroy成功吗?
A5:可以在new Texture的地方包装一个CreateTexture的自定义方法,在里面自己记录下创建tex的数量,Destroy的地方也是包装一个DestroyTexture方法,减少tex的数量,这里需要看下全部Destroy之后数量是不是归零了,因为有可能你销毁的数量没有创建的数量多,也有可能你前面刚Destroy掉,后面又给new出来了。
感谢jump晃悠@UWA问答社区提供了回答
Memory
Q:项目这部分内存占用这么大怎么办?
A:这个就是托管堆内存的占用。C#的对象、碎片和预留的占用都统计在这里。最好用MemoryProfiler真机测试排查驻留的对象类型、数量是否合理。
连接工程可定位到堆内存对象的引用链信息,更有助于精准定位到问题。
针对以上问题,有经验的朋友欢迎转至社区交流:
https://answer.uwa4d.com/question/6743f6cf682c7e5cd61bf9a1
封面图来源于网络
今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。
UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859