Будни одного фрейма в Halo Infinite

Часто вижу ехидные смешки про оптимизацию и техническое состояние Halo Infinite. Всем советую посмотреть недавнее видео с GDC от разработчиков.
Набросал небольшую заметку по ключевым моментам.

А ещё можно подписаться в Твиттере на одного замечательного автора (¬‿¬ )

Всё дело в том, что при разработке Halo 5 движок был заточен под Xbox One с их 8 ядрами и фиксированным фпс.

Будни одного фрейма в Halo Infinite

Для Infinite нужно было переделать движок, чтобы он работал под кучей разного железа (особенно на ПК) с варьирующимся фреймрейтом при этом.

Будни одного фрейма в Halo Infinite

Раньше они задачи раскидывали ручками на конкретные ядра. Приходилось в голове держать очень много информации о системе в целом.

Большая проблема при онбординге новых сотрудников. Даже если человек пишет абсолютно новую подсистему, то ему нужно разобраться, что за работа в основном потоке и что во вспомогательных.

В итоге переписали движок, разделив часть по использованию времени CPU на 2 части:

  1. Fixed update
  2. Variable update
Будни одного фрейма в Halo Infinite

Дальше очевидным решением было завести систему рабочих потоков. При этом, старое легаси говно никуда не делось.

Пришлось добавить синкПоинты, когда основной поток ожидал, пока выполнятся jobs'ы. Хотя сами воркеры и очень помогали, но вот эти точки ожидания очень мешали.

Будни одного фрейма в Halo Infinite

Система рабочих потоков помогла:

  1. Нормально зависимости задать.
  2. Выделить части систем, чтоб они работали чисто на джобсах. Весь рендер в итоге на них стал крутиться.
  3. Новичкам было проще погрузиться, т. к. они могли посмотреть хайлевел представление системы.

Из забавного (для нынешних разрабов, которые с лоулевелом не работают, не очевидное): лучше подождать 0.2мс после запуска джобсов, чем просрать ресурсы на sleep/awake и переключение контекста 😅

Будни одного фрейма в Halo Infinite

С ПК всё очевидно, думаю.

  • Куча разного железа.
  • Система в любой момент может отжать ресурсы.
  • В системе одновременно может работать несколько тяжёлых процессов, что в принципе на консолях не бывает.

Опять же, из забавного: на ПК не более 9 воркеров создают, даже если у вас на машине 20+ ядер.

Опытным путём команда выяснила, что нет смысла больше воркеров создавать, польза от них после 9 отрицательная.

Будни одного фрейма в Halo Infinite

В целом решение оказалось норм. Но из больших проблем, например, отсутствие нормальной настройки зависимостей между данными и воркерами. Особенно если используются общие ресурсы.

Будни одного фрейма в Halo Infinite
6464
56 комментариев

Вы жулик и вор, Андрей. Я видел этот пост в паблике Gamedev Suvffering в ВК.

11

Враньё. Я украл из Твиттера (¬‿¬ )

14

Набросал небольшую заметку по ключевым моментам.Вау, он наконец прислушался к людям!

5

Какие люди? Я здесь один.

9

Если кратко, это это все пк виноват

2

Одно из лучших технически-ориентированных выступлений за этот год на GDC, серьёзно.

2

Одна из самых неоптимизированных игр последних лет.

2