因为我们现在是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的时候差不多。