UE5 Distance Field更新导致卡顿的问题排查


最近在排查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
);

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注