Is VALIDATE_UNIFORM_BUFFER_LIFETIME still work ?

编辑器内遇到关于FRHIUniformBuffer生命周期相关的Crash,开启VALIDATE_UNIFORM_BUFFER_LIFETIME调试,编辑器必崩。使用官方引擎,默认地图Open World,还是有崩溃。想问一下这个宏现在还好用么?如果不好用,现在怎么追查UniformBuffer类似崩溃。

重现步骤

  1. Enable VALIDATE_UNIFORM_BUFFER_LIFETIME
  2. New World Partition Default Map
  3. -NoRHIThread
  4. PIE

Hi,

这个VALIDATE_UNIFORM_BUFFER_LIFETIME这个功能我们没有测试每天验证,所以这个功能已经目前处于失效状态。

你们看到的这个崩溃并不是说明这个被使用中的UniformBuffer被释放了,更多的时候是因为有些ShaderBinding没有执行析构函数,导致没有走到FMeshDrawShaderBindings::Release(),有一个类似的帖子 [Content removed]

请问你们原始的崩溃是什么情况?正常情况主要保证资源在释放以前,GPU已经执行结束,就可以正常释放。一般开启了GRHINeedsExtraDeletionLatency的RHI不太会遇到这种情况。

感谢回复,我们是PIE开启两个用例,出现的Crash。如果是一个用例的话,就不会崩溃。

嗯嗯,我仔细看了一下VALIDATE_UNIFORM_BUFFER_LIFETIME的功能,我感觉还是有很大漏洞的。这个功能能工作的的前提是所有的FMeshDrawShaderBindings需要正常释放,并且要在保证在FRHIUniformBuffer的释放前释放。目前应该没有机制能保证这个情况。因为FMeshDrawShaderBindings只是在UniformBuffer上做了统计,但没有做引用,所以如果释放顺序不能保证,即便是在同一帧释放的,也会报错。

我个人建议不要使用这个功能了。

如果我UniformBuffer统计FMeshDrawShaderBindings,在ShaderBindings还有残留的时候,延迟删除UniformBuffer是不是可行呢。

理论上是可行的,不过还有个前提,就是ShaderBindings需要能走到自己的析构函数,我担心有些地方引用用了RDGBuilder.AllocPOD,导致没有走析构函数,所以不会正确释放引用关系。

好的,感谢回复,我去检查一下

好的,目前我们也知道这个问题,并有一个jira UE-149995追踪这个问题,希望能在下个版本修复这个功能。

抱歉,不是很清楚,我该怎么跟踪这个问题呢,去哪搜这个数值

Hi,

这是我们内部的jira,暂时没有对外开放访问权限,不过我看到我们已经去掉了VALIDATE_UNIFORM_BUFFER_LIFETIME的支持,应该是觉得这个功能已经失效,且难以维护。

https://github.com/EpicGames/UnrealEngine/commit/53071436de51dfbc42bf0faf7e170ebdb1b1b23b

好的,谢谢回复了