偶现skeletalMesh模型丢失

偶现skeletalMesh模型丢失

  1. RenderDoc DrawCall存在
    1. PositionBuffer 全 0
    2. TangentBuffer 全 0
    3. SkinWeight 全 0
    4. BoneMatrices 数据正常
  2. Reload Skeletal Mesh 可以恢复正常
  3. 丢失的模型的资源创建时的位置和释放时的位置不一样
  4. 这次丢失创建和销毁也没有隔多久,差不多一个剧情的时间

怀疑出现问题的地方:

  • 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]

重现步骤
偶现问题,复现概率非常低.大致就是我们的项目中有时候会遇到skeletal模型加载上来之后没有显示,renderdoc抓出来之后,PositionBuffer等都是0

[Attachment Removed]

我们在5.6也有遇到类似的情况,复现概率非常低,所以还没来得及截帧看

[Attachment Removed]

Hi,

从代码的流程上看,的确有可能出现你说的情况,新版本有一个fix,应该可以保证RHI Command的执行是按照Submit的顺序,你可以合入一下试试。

https://github.com/EpicGames/UnrealEngine/commit/d7982c25d3af97e097c5ebcf83d8c2ba2d3b9955

[Attachment Removed]

方便交流一下这个情况么,这是我的邮箱1181469308@qq.com

[Attachment Removed]

我们刚刚复现了也成功截到帧​了,但是看着各个buffer里的数据都是正常的,只是basepass的时候深度测试莫名其妙就没通过

我们在编辑器上负载大的时候相对容易复现一些,而且通过任何方式让​材质重新编译一下之后就能绘制出来了

[Attachment Removed]

可能不是同一种情况,之前有客户是在材质里使用了Pixel Depth Offset,有些nan的值,导致渲染出问题,你们可以先试试default material会不会有这种情况发生。

[Attachment Removed]