最近在排查UE5 Distance Field更新导致卡顿的问题, 改进了一小部分, 大致总结一下~
参考材料
1. [UE5]稀疏距离场 – 2.距离场的流化
卡顿的原因主要是, Distance Field的更新频率较高, 只要有某个Object的Distance Field的Mid等级发生改变, 就会触发Distance Field的更新. 此时, 会在FDistanceFieldSceneData::UpdateDistanceFieldAtlas中执行下述通过DX12创建新的显存池的逻辑, 这一步是极为耗时的. 私以为, 这个直接创建新的显存池的逻辑是极为粗暴的, 或许有改进的空间.
if (NumBrickUploads > 0)
{
// Allocate staging buffer space for the brick atlas compute scatter
AtlasUpload.AllocateAndLock(GraphBuilder.RHICmdList, NumBrickUploads, DistanceField::BrickSize);
UpdateParameters.BrickUploadDataPtr = AtlasUpload.BrickUploadDataPtr;
UpdateParameters.BrickUploadCoordinatesPtr = AtlasUpload.BrickUploadCoordinatesPtr;
}
自己并没有对上述逻辑作出有效的修复, 只是对参与Distance Field的更新的Objects作出更细粒度的Culling, 即禁止Bounding Box Size小于阈值的Object参与Distance Field的更新.
float GMeshDistanceFieldsMinObjectBoundingRadius = 30.0f;
FAutoConsoleVariableRef CVarMeshDistanceFieldsMinObjectBoundingRadius(
TEXT("r.DistanceFields.MinObjectBoundingRadius"),
GMeshDistanceFieldsMinObjectBoundingRadius,
TEXT("Objects smaller than this will not be included in the Mesh Distance Field scene, to improve performance."),
ECVF_RenderThreadSafe
);