Valve раскрыла подробности оптимизации движка Source под OpenGL

На конференции SIGGRAPH представители компании Valve продемонстрировали движок Source, портированный для Linux, запустив игру Left 4 Dead 2.

Также, одновременно была показана презентация (слайды презентации ниже), в которой были описаны подробности произведённой оптимизации, в результате которой движок Source при использовании OpenGL выдал больше кадров в секунду, чем при использовании Direct3D при запуске игры в Windows 7 (315 FPS против 270 FPS). Докладчиком по данному вопросу выступил Rich Geldreich, автор открытой библиотеки Crunch, ныне работающий в Valve.

Наиболее интересные моменты:

  • При использовании видеокарты NVIDIA GeForce GTX 680 вместе с OpenGL движок, в среднем, на 11% быстрее, чем при использовании с Direct3D (планируется отыграть еще около 5% путем оптимизации транслятора вызовов Direct3D в OpenGL)
  • Очень интересно то, что движок работает быстрее, несмотря на то, что рендеринг производится путем транслирования Direct3D вызовов и абстракций в вызовы и абстракции OpenGL, при этом есть дополнительный слой - транслятор. Однако это не помешало итоговой конструкции работать быстрее оригинала. Транслятор реализует маппинг Direct3D 9 в OpenGL практически 1 в 1
  • В случае многопоточных видеодрайверов паразитная нагрузка от транслятора и OpenGL соотносится как 50/50. Однако если видеодрайвер однопоточный, в вызовах OpenGL может быть потрачено до 80% времени а в трансляторе лишь 20%. Отмечается, что компания NVIDIA проделала много работы по организации многопоточности в своем драйвере
  • Valve сотрудничают с компанией Intel, AMD и NVIDIA
  • Изначально у выполняющей работу по портированию для Linux команды Valve был довольно ограниченный опыт. В основном помогла тактика интенсивного профилирования с анализом где сколько времени тратится на различные вызовы. Целью было учесть каждую микросекунду
  • Наиболее сложным было собственно профилирование. Во первых, сам игровой движок многопоточный, что существенно усложняет его профилирование. Во вторых, большинство средств профилирования не видит нить видеодрайвера, обрабатывающую запросы на рендеринг. В третьих, у движка Source множество опций и он сильно масштабируем под разные конфигурации
  • Также был использован инструментарий от RAD Game Tools под названием Telemetry

Некоторые моменты оптимизации:

  • Поддержка многопоточности в режиме OpenGL
  • Убрано большинство вызовов glXMakeCurrent
  • Исправлено использование pthreads
  • Сокращен оверхед трансляции D3D->GL путем переписывания самых горячих мест
  • Улучшен dirty range tracking
  • Добавлен отдельный однородный массив для базовых матриц
  • Улучшено обновление динамических буферов и оптимизации настроек компилятора
  • Наиболее полезными в плане улучшения производительности было использование опции компилятора "-ffast-math" и отключение опции "-fPIC"

Презентация с подробностями произведённой оптимизации

Кинофильм