自从UE5.5开始,MetalRHI在一帧中使用了超过10个CommandBuffer,造成了大量内存浪费

Metal RHI Context Refactor · EpicGames/UnrealEngine@056d57f

自从这个MetalRHI重构change之后,一帧中使用的CommandBuffer数量非常多,导致Metal CommandBuffer和CommandEncoder的内存占用比低版本的引擎高很多(低版本引擎一帧只会使用两个CommandBuffer)。

根据apple的Metal Best Practices Guide: Command Buffers,每一帧应该提交尽可能少的CommandBuffer。

请问应该如何修改来优化一帧中的CommandBuffer数量呢?

重现步骤
iOS平台,使用UE5.5及以后的版本,默认场景,MetalCapture抓一帧即可看到CommandBuffers数量。

[Image Removed]

内存的话,可以通过Allocations或者MemoryGraph抓取验证。

[Image Removed]

Hi,

你好,抱歉回复的很晚,我在国庆前测试过,的确有你说的问题,主要原因是在渲染阶段有多次的buffer提交(也跟UploadContext有关),我暂时没有看到什么现成的cvar可以控制,我也在跟开发的同事讨论,看看有什么好的办法优化。我猜测应该是想办法保证在渲染阶段,只有1到2次的gpu submit,等后续有结论了,我再给你更新。

我把问题已经反馈给开发的同学了,我估计下周还会继续讨论解决方案,如果后续有反馈,我再给你回复。希望能够针对IOS,减少commandbuffer的数量。

大佬们请问下讨论有啥进展么

Hi,

上次跟开发的同事交流过后,他做了一些改动,并测试了一下,他的改动是有减少commandbuffer的数量,不过暂时还没有提交,我问一下情况,后续有进展,我再这里回复。

Hi,

能否测试一下这个改动,https://github.com/EpicGames/UnrealEngine/commit/183e4bfb4c829f03234d60ff2c5f7c5b3f45bb02