UE4-PS4开发渲染线程优化方法及记录

先说方法:

  1. Launch 到 PS4 Devkit上,在PS4上输入Stat unit 看瓶颈在哪里。我们发现Frame 和Draw数值几乎一样,其余两项相对较小,这表明瓶颈在渲染线程上。
  2. 关于渲染线程的相关知识:https://docs.unrealengine.com/udk/Three/RenderThreadProfilingHome.html
  3. 在编辑器中打开Session Frontend,打开Profiler,在左边的MySessions中找到并选择当前激活的(后面有绿色点)Launch On Device>PS4 Development Kit
  4. 点击右侧的Data Capture,稍等一段时间(十几秒以上)再次点击DataCapture,会提示是否把数据传输到本地,选择是
  5. 传输完成后在下方出现的提示信息中点击“Load File”即可打开数据。注意,该数据存储在开发机上,如果以后需要再次打开改数据,参考如下路径:O:开发机ip地址data工程名称工程名称savedprofilingunrealstats,所有的capture 文件都放在这里,文件夹名称都包含了时间,这里O:是开发机硬盘在PC上的映射盘符。
  6. 打开后在graph view 中拖动选择一定范围的数据,然后选择下方的Maximum,然后在Event Name中找到问题线程,(目前是Render Thread)。

  7.  

    逐层展开查找耗时最多的。重点看Inc Time(MS)和Inc Time(%)这两项,点击其标题可以以此项进行排序,默认即是以Inc Time递减顺序排序。注意CPU Stall - Wait For Events可以忽

    略,出现这个通常是cpu在等待GPU。

我们找到的问题记录:


  1. Init View中的Init dynamic shadow,占据了13ms的渲染时间,并且下方给出了具体是那些actor的问题
    解决方法:
    a. 把streetLightActor中的灯光投影彻底关闭(这里不是很清楚,为什么没有开启他们的dynamic shadow,也出现在dynamic shadow的条目里)
    b. 把Directional Light的动态阴影关闭
    结果:平均帧率从20提高到30,帧率提高了10
  2.  第一个问题解决后,再次Profile,找到的问题是Occlusion Cull,占用了不到4ms,原因是场景中物体太多,culling带来了负担

    解决:
    a. 场景中的独立物体采用distance culling,
    b. 删除大量背景树木,牺牲一点效果来换取效率
    这里提供两篇很好的参考:
    http://timhobsonue4.snappages.com/culling-visibilityculling.htm
    https://answers.unrealengine.com/questions/173484/cpu-render-thread-optimization.html
    结果:似乎帧率并没有大幅的提升……

  3. 经过多次测试,发现并不存在特别明显的某方面的瓶颈,渲染线程每项的耗时都比较高,因此决定需要从减少同时渲染物体数量上着手。我们的场景类似于赛车类游戏的赛道,场景很大,道具(包括灯光)种类很少,但是由于路径很长,重复量非常大。我们将整体场景沿玩家行进路线进行了场景切割(分成了16个区域),除路上的路灯模型、路灯灯光、路下方的支撑柱以及路上的标志牌灯,也同时把路旁的广告牌等道具划分到相应的区域内,采取了Streaming Level的方式加载这些关卡。结果帧率得到了极大的提升,可以说从根本上解决了帧率低的问题。
原文地址:https://www.cnblogs.com/AnKen/p/6913534.html