偶现skeletalMesh模型丢失
- RenderDoc DrawCall存在
- PositionBuffer 全 0
- TangentBuffer 全 0
- SkinWeight 全 0
- BoneMatrices 数据正常
- Reload Skeletal Mesh 可以恢复正常
- 丢失的模型的资源创建时的位置和释放时的位置不一样
- 这次丢失创建和销毁也没有隔多久,差不多一个剧情的时间
怀疑出现问题的地方:
- upload copy 命令录制在 UE::RenderCommandPipe::SkeletalMesh 的独立 pip上;
- Frame N 的某次 SubmitToGPU flush 发生时,该 pipe 的 RHIcmdList
- 尚未 FinishRecording + QueueAsyncCommandListSubmit 接入提交链;
- 实现中 upload 完成后立刻 UnlockPoolData() 允许 defrag 在 N+1 BeginFrame 选中该 allocation;
- N+1 BeginFrame 的 defrag copy 更早进入下一次 SubmitToGPU flush;于是 GPU queue 中出现 defrag CopyBufferRegion(NEW, OLD) 先于 upload CopyBufferRegion(OLD, UPLOAD)的可能性。
因为Pip是在GameThread录制到cmdPipe上的,也是在这个阶段进行的分配的,但是defrag是发生在RHI线程最开始,如果某个GameThread发起的Task中分配成功了(但是还没有在RenderThread合入到CmdList上),而这个时候RHIBegin触发了Defrag,则可能出现上述问题.
[Image Removed]这种情况成立么?或者说有没有什么别的已知的/可能的别的出现上述模型丢失的情况哇?
[Attachment Removed]