SKM组件在mobile管线下的 GPUSkinCache的导致顶点布局不一致导致的miss

在mobile管线下,USkeletalMeshComponent组件使用GPUSkinCache的情况下。

CollectPSOPrecacheData 里收集的 FRHIVertexDeclaration的PrecachePSOHash与渲染用到的FRHIVertexDeclaration的PrecachePSOHash的不同,结果导致以下PSO missed

[Image Removed]经过代码跟踪调试,发现开启gpuskincache后,会创建GPUSkinPassthroughVertexFactory,并且会改写切线的数据宽度,创建新的顶点声明用于渲染,和PrecachePSO阶段的顶点声明不同。

[Image Removed]按道理说,psoprecache时候的顶点申明逻辑 和实际渲染创建顶点申明逻辑是对齐的情况下,不会造成miss,但是现在这种逻辑的差距导致了miss

请问,是否是引擎bug还是使用上面有什么不对的地方?

Hi,

这是因为FGPUSkinPassthroughVertexFactory::GetVertexElements返回的VertexElements实际上是来自于Mesh,但是GPUSkinCache开了之后,实际的顶点格式会在FGPUSkinPassthroughVertexFactory::InitRHI里做修改,两边对不上。

最简单的办法可以试试在调用FGPUSkinPassthroughVertexFactory::GetVertexElements后,添加

VertexElements[1].Type = VET_Short4N; VertexElements[1].Stride = 16; VertexElements[2].Type = VET_Short4N; VertexElements[2].Stride = 16; VertexElements[2].Offset = 8; VertexElements[8].Type = VET_Float3; VertexElements[8].Stride = 12;然后看一下是否有效。