unity 5.6.6f1
再检查项目的内存问题时发现Lightmap的加载会消耗大量堆内存(高达17M,总共差不多35张lightmap贴图)。抛开lightmap的资源内存分配理论上不应该消耗堆内存才对,查看加载的代码最终发现了问题。
- LightmapSettings.lightmaps 每次返回的是一个新创建的数组。在所有的lightmap加载完成后去查找单独每个lightmap数据的索引使用到这个API,这个是分配堆内存的主要原因。
- lightmapData.lightmapColor.name 每次都会创建一个新的string对象。项目里面使用查找每个lightmapData的时候使用了名字去查找对比,调用次数非常频繁导致消耗了不少堆内存
下面利用代码来解释上面两个导致消耗堆内存的问题:
1 |
|
查出并修改问题之后看了下引擎源码的LightmapSettings.lightmaps API
1 |
|
这是c++部分在返回给csharp时的处理。函数内调用了VectorToScriptingClassArray接口,也就是在返回给csharp层的时候把c++的lightmaps数组转换到新分配的csharp数组里然后返回给csharp层,相当于每次在csharp层调用LightmapSettings.lightmaps就会创建一个新的lightmaps数组了。
End