1. 典型以GPU为瓶颈的场景:
- 硬件队列繁忙的执行command buffers且没有空隙
- Driver queue持续累积等待GPU执行的command buffers
- 平均指令执行时间(Average command buffer execution time)超过了期待的FPS速率
注:Buffer execution time是从command buffer出现在队列中到执行完它的最后一条指令所需时间。这个时间越长,越说明瓶颈在GPU。
一般来说,瓶颈在GPU出于以下原因:在GPU上跑了非常复杂的shaders;消耗存储空间的资源比如几何或贴图;或者command buffers中提交了太多的绘制命令。
2. 瓶颈在于VSync的场景:
- 硬件队列有空隙,说明GPU没有完全繁忙
- Driver queue有空隙,说明CPU的图形学负载足够低
- Frame time比VSync intervals短
注:Frame time是从第一个frame package出现在队列中,直到最后一个frame package执行完的时间段。
3. 典型瓶颈在于CPU的场景:
- 硬件队列尺寸小并且有空隙。这说明GPU在多数时间空闲。
- Driver queue尺寸足够大。
在这些条件下一个可能的场景是CPU和GPU同步不充分,比如,GPU可能因等待CPU准备资源而阻塞。这样影响User Mode Driver的同步失调(desynchronization )会造成过多数量的包累积。
注:以CPU为瓶颈的场景是性能优化中最为复杂的情况。用Intel VTune Profiler来探索渲染过程中的CPU瓶颈,用Graphics Frame Analyzer来探索GPU瓶颈。为了探索CPU瓶颈,你也可以借助Graphics Trace Analyzer中用Debug API和ITT API markup生成的events。
4. 应用多线程GPU的场景:
- 同时跑超过一个的图形学应用
- GPU队列已满且包含来自多个线程的包
注:来自不同进程的包有不同的颜色。
注:在这种情况下,不可能准确的判断应用程序瓶颈在GPU还是CPU。停止所有无关的应用程序,然后重新捕获trace再分析。
实战分析:
对比:
结论:
相机移动时,瓶颈在CPU。
相机稳定后,瓶颈在VSync。
参考链接:
https://www.intel.com/content/www/us/en/resources-documentation/developer.html