Решили: синхронизация кадров и потолок FPS переехали к IDisplayService; по умолчанию vSync
включён, потолок — опция и работает только при выключенной синхронизации. Правило вынесено
чистым типом FramePacing и закрыто тестом FramePacingTests.
Почему: до этого у игры не было ни того, ни другого. Application.targetFrameRate не
встречался в коде ни разу, а vSyncCount приходил из уровня качества — и на активном уровне
(m_CurrentQuality: 0, Very Low) он равен нулю. Замер в play mode это подтвердил живьём:
targetFrameRate = -1, vSyncCount = 0, sync_interval = 0. Игра рисовала столько кадров,
сколько потянет железо, ради кадров, которых никто не видит: нагрев, шум кулера, батарея.
Отвергли два варианта. Оставить владельцем уровень качества — тогда появление переключателя
качества означало бы, что игрок, выбравший «покрасивее», молча меняет и синхронизацию: один факт
с двумя владельцами. Обойтись одним targetFrameRate (первое предложение агента) — хуже,
потому что документация Unity рекомендует обратный приоритет: vSyncCount это аппаратная
синхронизация, а targetFrameRate — программный таймер, дающий микростаттер, и при
vSyncCount > 0 он игнорируется целиком. Поэтому потолок обнуляется при включённой синхронизации:
иначе в файле и в UI жило бы число, на которое игра не смотрит, и «поставил 60, идёт 165»
читалось бы как баг.
Сказано: «Давай для начала замер профайлером? Заодно изучим вопрос оптимизации игры? А то мы про это вообще не вспоминали.» (06.08.2026, сессия f4d258ef). Заход начат по этой просьбе; приоритет «сначала vSync, потом development build» — тоже выбор Макса.
Грабли: QualitySettings.SetQualityLevel перезаписывает vSyncCount значением уровня.
Поэтому ApplyPacing зовётся при каждом применении, а не один раз на старте: появится в игре
смена качества — наш владелец обязан вернуть своё после неё. Отдельно: пасовка кадров применяется
и в редакторе, в отличие от разрешения — причина щадить редактор относится к перекроенному Game
view, а не к vSync, и разработчик должен видеть ту же плавность, что игрок.
Владелец правды: Core/Settings/FramePacing.cs, Game/Services/DisplayService.cs
(ApplyPacing), тест FramePacingTests. Замер и остальные находки — docs/performance-progress.md
(леса захода).