因为我们现在是5.4.4版本的引擎,目前没有升级的打算,然后OcclusionQuery会阻塞RenderThread。

因为我们现在是5.4.4版本的引擎,目前没有升级的打算,然后OcclusionQuery会阻塞RenderThread。+

[Image Removed]

r.NumBufferedOcclusionQueries这个参数可以调整OcclusionQuery的GPU帧,但是5.4版本这个参数是无效的。

我从5.5版本Pick过来两个提交,恢复了这个参数的功能,然后通过获取N-2帧的OcclusionQuery结果(默认是N-1帧)把这个阻塞的问题给解决了。

[Image Removed]

[Image Removed]

但是带来了另一个问题,帧率变得非常不稳定。同样都是在静止的视角下,利用N-1帧的结果RenderThread和GPU的时间就很稳定,但利用N-2帧的话过一段时间就会有突刺产生。利用InitViews看OcclusionCulling的结果一直都是恒定的。

[Image Removed]

因为 CPU 永远领先于 GPU,在某个时间点 CPU 一定会被迫停止并等待 GPU 同步。

→这个说法有点怪,因为即使设置r.NumBufferedOcclusionQueries为2,OcclusionQuery的阻塞消失,每帧的耗时也几乎没有变化,只是阻塞挪到了EndFlushResourcesRHI这里,但是突刺的产生却是多出来的开销。

事实是r.NumBufferedOcclusionQueries 为1的时候完全没有突刺,设置成2的时候就有突刺了。但是平均每帧的GPU时间和RenderThread时间在设置1或者2的时候差不多。

Hi,

你好,方便把这个trace发上来我看一下吗?EndFlushResourceRHI​主要是等所有的RHI线程的指令执行完,如果开启垂直同步,理论上就是等上一次的GPU执行结束,OcclusionQuery不去Poll Result的话,应该不会对gpu造成负担,所以这里的spike感觉还是来自于gpu的压力或者错过了垂直同步。

20250604_120919这个是r.NumBufferedOcclusionQueries为2的时候录的,OcclusionCullPipe的高耗时消失了,但是帧率不稳定

[Image Removed]20250606_144615这个是r.NumBufferedOcclusionQueries为1的时候录的

Hi,

从trace上看,应该是函数CreateCommittedResource函数造成的卡顿,这个函数应该就是申请GPU资源,的确有时候会造成卡顿,但是从trace里,我不太确定具体是什么在每帧重新申请资源,方便的话你可以定位一下,正常用RDG创建的buffer应该都会有缓存。

有个可能类似的情况,你可以看一下,看看改一下是否有用 [Content removed]

另外可以试试设置 r.AOGlobalDistanceField.RecacheClipmapsWithPendingStreaming 0,看看是否有效。