RenderDoc Perf Timeline
@shiko_qДисклеймер: это инструмент для поиска причины GPU bottleneck, преимущественно для PC, преимущественно для вендора Nvidia. Может работать и с другими вендорами (с оговорками), может помочь и с другими платформами (с оговорками).

Итак, цель - увеличить ФПС, в ситуации, когда основной тормоз - видеокарта.
Такую ситуацию мы называем "GPU Bound" и выглядит она в профайлере примерно так:

Если у вас сейчас в основном проблема в CPU, то этот инструмент вам сейчас не пригодится.
Как запустить:
- Делаем [снапшот рендердоком].
- Переходим в [Window -> Performance Counter Viewer].
- (Если ещё не) Качаем - устанавливаем Nvidia Perf SDK с офф. сайта по инструкции.
- Кнопка [Capture Counters]
- (Для теста можно взять уже готовые counters.csv и events.txt)
(Опционально) Я рекомендую пройти по шагам дальше, но если вы опытный и/или у вас не Nvidia GPU или другая платформа или нет нужных метрик - то выбирайте их и сразу переходите к шагу 6.
Жмём кнопку Load и выбираем вот [этот файл]. Либо же задаём следующие метрики. Эти метрики необходимы только для нормальной работы плагинов, они не обязательны в общем смысле.
Generic → D3D11 Built-in:
GPU Duration (ms) Rasterized Primitives Samples Passed VS Invocations PS Invocations CS Invocations
NVIDIA → nanoseconds
gpu__time_duration.sum gpu__time_active.sum
NVIDIA → bytes (DRAM traffic)
dram__bytes_op_read.sum dram__bytes_op_write.sum dram__bytes_op_read.avg dram__bytes_op_write.avg
NVIDIA → instructions
sm__inst_executed.sum sm__inst_executed.avg
NVIDIA → percent
tpc__average_registers_per_thread_shader_3d.avg.pct tpc__average_registers_per_thread_shader_cs.avg.pct tpc__average_registers_per_thread_shader_ps.avg.pct tpc__average_registers_per_thread_shader_vtg.avg.pct l1tex__t_sector_hit_rate.avg.pct lts__average_t_sector_hit_rate_realtime.avg.pct lts__t_sector_hit_rate.avg.pct smsp__warp_issue_stalled_barrier_per_warp_active.avg.pct smsp__warp_issue_stalled_branch_resolving_per_warp_active.avg.pct smsp__warp_issue_stalled_dispatch_stall_per_warp_active.avg.pct smsp__warp_issue_stalled_drain_per_warp_active.avg.pct smsp__warp_issue_stalled_lg_throttle_per_warp_active.avg.pct smsp__warp_issue_stalled_long_scoreboard_per_warp_active.avg.pct smsp__warp_issue_stalled_long_scoreboard_pipe_l1tex_per_warp_active.avg.pct smsp__warp_issue_stalled_math_pipe_throttle_per_warp_active.avg.pct
NVIDIA → registers / thread
tpc__average_registers_per_thread_shader_3d.avg.ratio
6. Кнопка [Sample Counters], жмём.
7. Экспортируем результаты нажав кнопку 💾 - справа от кнопки [Capture Counters], что мы нажимали в шаге 4 -> counters.csv
8. В окне [Event Browser] нажимаем тоже кнопку 💾 и сохраняем -> events.txt
9. Качаем основной файл [timeline.html] и, если выполняли шаг 5 - два плагина к нему: [BoundsDetector.js] и [ShaderXray.js].
10. Запускаем [timeline.html], перетаскиваем (Drag & Drop) или жмём соответствующие кнопки и выбираем наши events.txt и counters.csv соответственно
11. Если выполняли шаг 5 - жмём кнопку [ + ] справа по центру или опять Drag & Drop для скачанных плагинов (по одному) - BoundsDetector и ShaderXRay.
Как читать:
- Выбираем наверху слева основной каунтер. Обычно это GPU Durations или gpu_active_durations.sum
- Выбираем дроуколл который дольше всех выполняется, жмём на него
- Смотрим и читаем, что там в [BoundsDetector] написано.
- Если проблема в шейдере (не в ROP, не в смежных вещах, типа овердроу, а именно в самом шейдере) - переходим в [ShaderXRay] и смотрим-читаем рекомендации что именно жрёт в шейдере.
- Кнопка "Ask AI" копирует в буфер обмена системный промпт и необходимый для ответа контекст (преформат каунтеров и ивент информации) - можно отправить в любой чатбот