在Android机器上,第一次进游戏加载过程,或者死亡复活之后重新加载过程,会出现vkCreateBufferView崩溃,添加了下Log发现崩溃Buffer:
[2025.07.10-15.12.23:785][285]LogVulkanRHI: Warning: SRV ResourceName: None,BufferName: FGlobalDynamicReadBuffer_AllocateInternal, Usage: 16644
[2025.07.10-15.12.23:785][285]LogVulkanRHI: Warning: VULKANRHI: [D:0x0x79074fda40] 150197: vkCreateBufferView(Info=0x0x791ae44f08, OutBufferView=0x0x7774aae9c8)
[2025.07.10-15.12.23:785][285]LogVulkanRHI: Warning: VULKANRHI: VkBufferCreateInfo: Flags=0, Buffer=0x0x790fc32500, Format=R32_SFLOAT, Offset=1792, Range=136
是在FGlobalDynamicReadBuffer_AllocateInternal,进一步查了下代码,是在:NiagaraRender里面的TransferDataToGPU里面会创建此Buffer:
FParticleRenderData Allocation; Allocation.FloatData = TotalFloatSize ? DynamicReadBuffer.AllocateFloat(RHICmdList, TotalFloatSize) : FGlobalDynamicReadBuffer::FAllocation();
请问对这个崩溃有什么解决思路么?
Liu.Wei
(Liu.Wei)
3
Hi,
我搜了一下,貌似没有看到内部有类似的情况,我只知道mali的设备创建texel buffer有65535的上限,不知道你遇到的是否是mali的设备?
不过从你提供的log看 Range(是不是Buffer Size?)应该不大,(不过我好奇VkBufferCreateInfo好像只提供了size和usage,Offset是哪里来的?)
VulkanDebug里面开启FWrapLayer::CreateBufferView里面对应的宏可以打印VkBufferCreateInfo的信息,目前我这边定位的话,猜测极有可能是因为在发生场景切换的时候,Renderer更新的最后一帧有Niagara渲染的情况下,比如有循环特效,然后再加载到新场景,第一帧渲染Niagara会有概率崩溃,rhi是崩溃在vkCreateBufferView,renderer打印了log,发现每帧都会对BufferPool的buffer进行reuse,其中包括每帧commit的时候进行unlock,但是这个时候相同的buffer在rhi线程进行VkBufferCreateInfo,不确定这两者会不会产生冲突呢,但是正常场景一直这个流程没问题,但是涉及到切换场景就会概率崩溃,没太有思路上一帧的切换会造成什么影响,比如渲染资源的延迟释放等?
Liu.Wei
(Liu.Wei)
5
能试一下开启r.Vulkan.EnableValidation 2(配置在ini里),然后看一下是否有更多相关log信息吗?另外是否有崩溃的堆栈,我可以搜一下内部是否有纪录。我暂时记不清我们是否有过相关问题的修复,如果有更多的信息,我可以继续搜索一下,或者如果有相对稳定的复现工程,我可以尝试定位一下。
好的,我尝试下r.Vulkan.EnableValidation, 堆栈如下:复现工程比较大,而且需要服务器,可能不太好提供
[Image Removed]
Liu.Wei
(Liu.Wei)
7
Hi,
查到了,5.4版本修复了这个问题,你可以把DynamicBufferAllocator.cpp的下面这句里的BUF_Volatile改成BUF_Dynamic,应该就能修复这个崩溃。
Buffer->Initialize(RHICmdList, TEXT("FGlobalDynamicReadBuffer_AllocateInternal"), sizeof(Type), NewBufferSize, Format, BUF_Volatile);
你好,经过测试把BUF_Volatile改为BUF_Dynamic确实可以解决我们的崩溃,请问Volatile和Dynamic标记UE会做什么特殊处理么?怎么确定哪里需要用BUF_Volatile,哪里需要BUF_Dynamic呢
Liu.Wei
(Liu.Wei)
10
Hi,
改动来自 https://github.com/EpicGames/UnrealEngine/commit/2457350cc6b4d707f27d438b0e1e4d8bc12ce70f,注释说明了问题:
Only VulkanRHI has a special path for BUF_Volatile and it does not align with FGlobalDynamicReadBuffer expectations about buffer lifetime
我觉得Volatile和Dynamic的区分其实没有特别明确,我的理解是Volatile的意思是每帧会变,Dynamic的意思是经常会变。理论上Buffer的生命周期要跨帧,应该用dynamic比较合适。