最近用unity的Profiler对公司项目进行内存profile,发现一些问题,记录一下。
用Memory Area的Detailed View,用法见:http://docs.unity3d.com/Manual/ProfilerMemory.html
一,
可以看到Not Saved->RenderTexture下有两个ImageEffects Temp。想不出它们是因何而来。
注:在profile过程中直接点Take Sample才容易看到ImageEffects Temp,如果先点曲线区域使项目暂停运行了再Take Sample,有时候会看不到ImageEffects Temp。
于是开始用屏蔽法排查,发现当场景中某个节点关掉之后ImageEffects Temp就不再出现了,再检查此节点,发现上面挂了个脚本。对脚本中的函数逐个进行屏蔽,发现当其中一个函数屏蔽之后ImageEffects Temp就不再出现了。这个函数是一个空函数:
void OnRenderImage(RenderTexture src,RenderTexture dest){}
一般这个函数里都会调用个Graphics.Blit(src, dest, mat)之类的,但是可能写程序的人临时改了思路把其中的语句删了,但是没删函数,这样不仅导致这个回调每帧都被调用,而且还为了参数创建了renderTexture!!!
不知道开启某些优化选项后这个会不会被优化掉,但出于稳妥考虑,这种空函数还是清理干净为好。
二,
在Not Saved->Texxture2D下面有
Unity GI SystemTex RGBM
Unity GI SystemTex RGBM
Unity GI SystemTex Directionality
这几个项目,看起来跟GI有关,想看看究竟是怎么来的,是不是必须的。
在Windows->Lighting下面把Precomputed Realtime GI和Baked GI都关了,然后再profile还是有这三项。
后来新建了个工程做实验,发现在不烘焙lightmap之前profile,是没有这三项的,但一旦烘焙了lightmap再profile,这三项就出来了,虽然查看这三项中的图像与lightmap中的图像并不相同,但是似乎只要lightmap存在它们就存在。目前只知道这些。