Niagara GPU粒子引起的OcclusionCullPipe高开销

Epic中国:

你们好。

我们在打包版本捕获的Insight数据中,发现CPU的GameThread周期性的卡顿。排查发现OcclusionCullPipe开销异常(20ms,甚至更高)。我们锁定到问题是一批GPU粒子带来的。

于是我做了一个测试工程来复现Niagara GPU粒子带来的问题。

附件中是测试工程以及打包版本的Insight数据。

简单介绍一下:

  1. LevelA是10x10个数量的Niagara,每个Niagara有512个GPU粒子。
  2. LevelB是1个Niagara,有51200个GPU粒子。
  3. LevelC是空场景

打包之后,按1进入LevelA。按2进入LevelB。按3进入LevelC。

使用以下指令进行捕获:

  • Stat NamedEvents
  • Trace.Enable default
  • Trace.Start
  • Trace.Stop

8x8x8密度512x100。1(14.39ms):10.9ms. 2(14.07ms):11.3ms. 3(13.59ms):4.1μs.

8x8x4密度256x100。1(14.32ms):10.4ms. 2(13.91ms):10.9ms. 3(13.56ms):4.7μs.

从对比数据上看,Niagara数量、粒子数量,对于OcclusionCullPipe的开销影响很小。

希望官方能给些信息,帮助降低Niagara GPU粒子造成的OcclusionCullPipe开销。

[Attachment Removed]

Hi,

你好,请问你是怎么判断出来是GPU粒子带来的异常? OcclusionCullPipe通常是因为等待上一帧的GPU结束,这样才能获取Query的结果,所以一般情况下都是因为GPU的工作比较重导致的。可以看一下项目的trace,看一下OcclusionCullPipe卡顿的时候,上一帧的GPU工作主要有哪些?

[Attachment Removed]

在我们游戏中,版本管理上面看到有一次提交了一个武器特效之后,帧率急剧下降。Insight捕获到GameThread和RenderThread都在等待。等待时间的垂直区域发现是OcclusionCullPipe。

在单独测试的时候,将问题Niagara放到单独的场景中进行测试,发现有Niagara和没有Niagara,OcclusionCullPipe的开销是有明显差距的(10ms+)。

然后在我提交的测试工程和已有的insight数据中也可以看到OcclusionCullPipe在LevelC的开销是4μs+.,而在有Niagara的场景中,高达10ms+。

如果这个结果不足以说明问题,请具体描述担忧和是否需要游戏数据。

[Attachment Removed]

Hi,

看起来是因为gpu上这个耗时明显加长了,导致cpu的卡顿,可以看一下 r.SkyLight.RealTimeReflectionCapture.TimeSlice.SkyCloudCubeFacePerFrame是不是6?如果是的话,可以改成2。

我不确定这个Niagara对GPU有多大的开销,如果其本身开销很高,可能也需要想办法优化一下。

[Image Removed]

[Attachment Removed]