[Unity Docs -> FrameTiming.cpuMainThreadPresentWaitTime](https://docs.unity3d.com/ScriptReference/FrameTiming-cpuMainThreadPresentWaitTime.html)
**Что именно складывается в `cpuMainThreadPresentWaitTime`**
|Что ждёт главный поток|Где это видно в Profiler Timeline|Почему происходит|
|---|---|---|
|**`WaitForPresent`** (ожидание завершения `Present()`; иногда метка `Gfx.WaitForPresentOnGfxThread`)|серо-голубой блок с подписью «[wait]» в конце кадра|GPU ещё рендерит предыдущий кадр; драйвер блокирует CPU, пока не закончится рендер и монитор не начнёт следующую вертикальную развёртку (VSync)|
|**`WaitForTargetFPS`** (достижение заданного FPS)|такой же «[wait]», но появляется, когда работа ЦП и GPU уже завершена|Unity «спит», чтобы не превысить `Application.targetFrameRate` или VSync (например, 60 Гц)|
`cpuMainThreadPresentWaitTime` просто суммирует длительности **всех** этих «[wait]»-блоков за кадр — и время, пока поток бездействует из-за `Present()`, и время, когда он удерживается из-за ограничения частоты кадров. Поэтому:
- Если значение велико, а `gpuFrameTime` небольшое, Вы ограничены **VSync/целевым FPS**: CPU и GPU успевают раньше, чем дисплей готов показать новый кадр.
- Если значение велико, а `gpuFrameTime` ≈ длительности кадра, проект **GPU-bound**: CPU ждёт, пока GPU дорисует предыдущее изображение.
- Если значение близко к нулю, главный поток не тратит время в ожидании и, вероятнее всего, упирается в работу CPU либо баланс CPU/GPU.([Unity Manual](https://docs.unity3d.com/ScriptReference/FrameTiming.html "Unity - Scripting API: FrameTiming"))
> **Итого:** фраза «sum of shown “[wait]” blocks» означает, что Unity берёт **каждый** «[wait]»-участок, появившийся на Main Thread за кадр (независимо от причины ожидания), и складывает их длительности. Полученная сумма и есть `cpuMainThreadPresentWaitTime`, которую возвращает `FrameTimingManager` или `FrameTiming.cpuMainThreadPresentWaitTime`.