当使用多个 component的情况.每添加一个,内存最终会增加1M 左右的 内存. 即使只是一个 正方体box. 这么耗内存的软件太可怕了. 岂不是1k个方盒子对象,那电脑直接就可能爆了? 不过话说回来,还得要解决下才好.
1)使用的是develop 版本的unreal 所以不知道和这个有关否. 待定.
2)直接定位代码找到消耗内存的地方.
1 经过反复对比定位.定位到此函数运行后内存会增加很大FxxxSceneProxy::GetDynamicMeshElements(
在此函数直接返回.内存不变.
2 每增加一个 section,内存增加很明显. 和顶点数量都无关; 将所有顶点放入一个section, 内存大大减少.
3 不过就算是一个section,内存增加也很大. 反复跟踪代码未找到最终使内存增加的明显地方.即使GetDynamicMeshElements 函数完全运行调试到函数返回,内存也并未立即增加. 所以确定 是其他地方根据此函数的变量值,导致内存增加.
4 再回到GetDynamicMeshElements 函数, 逐行排除可能导致外部变量修改的地方.最终发现
meshBatchElement.PrimitiveUniformBuffer=
CreatePrimitiveUniformBufferImmediate(pHostSceneProxy->GetLocalToWorld(), pHostSceneProxy->GetBounds(), pHostSceneProxy->GetLocalBounds(), true, pHostSceneProxy->UseEditorDepthTest());
这个转换矩阵赋值运行后内存增加巨大.如果不运行此行,直接返回代码. 内存变化微弱.
目前只是发现这里导致内存增加.到底为什么增加, 如何能不导致内存以M的数量增加.还待定位.
解决办法:
1 在函数: GetDynamicMeshElements 中
FMeshBatchElement& meshBatchElement = meshBatch.Elements[0];
;
meshBatch.bWireframe = bWireframe;
meshBatch.VertexFactory = &Section->VertexFactory; //&pProxySection0->VertexFactory;//
meshBatch.MaterialRenderProxy = MaterialProxy;
//continue; 这个居然导致内存大增.如何破? 这里创建一个就可以了.不要每个 section创建.
meshBatchElement.PrimitiveUniformBufferResource = &((FMultiplexMeshSceneProxy*)pHostSceneProxy)->m_uniformBuffer;
//不能每次如此创建变换矩阵. 会导致内存暴涨. 而上面的使用方式可以降低数倍内存.
//meshBatchElement.PrimitiveUniformBuffer = CreatePrimitiveUniformBufferImmediate(pHostSceneProxy->GetLocalToWorld(), pHostSceneProxy->GetBounds(), pHostSceneProxy->GetLocalBounds(), true, pHostSceneProxy->UseEditorDepthTest());
2 每个component 不能存在过多的 section, 应将相同的 材质作为同一个 SceneProxy 渲染需要的 section 组合数据点. 可以降低数倍的数据.
3/为何这两处会引起如此高.暂时没有时间定位