Представители Valve раскрыли подробности оптимизации движка Source под OpenGL
На конференции SIGGRAPH компания Valve публично продемонстрировала портированный для Linux игровой движок Source, на примере запуска в Linux игры Left 4 Dead 2. Одновременно была показана презентация, в которой были раскрыты подробности проведённой оптимизации, в результате которой движок Source с компонентом рендеринга через OpenGL, запускаемый в Linux, продемонстрировал более высокие результаты производительности, чем при использовании 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 (которая недавно как раз представила очередную порцию изменений в драйвере по просьбе Valve), AMD и Nvidia. Изначально у выполняющей работу по портированию для Linux команды Valve был довольно ограниченный опыт. В основном помогла тактика интенсивного профилирования с анализом где сколько времени тратится на различные вызовы. Целью было учесть каждую микросекунду.
- Наиболее сложным было собственно профилирование. Во первых, сам игровой движок многопоточный, что существенно усложняет его профилирование. Во вторых, большинство средств профилирования не видит нить видеодрайвера, обрабатывающую запросы на рендеринг. В третьих, у движка Source множество опций и он сильно масштабируем под разные конфигурации.
- Кроме всего прочего был использован инструментарий от RAD Game Tools под названием Telemetry.
- Некоторые оптимизации: поддержка многопоточности в режиме OpenGL; убрано большинство вызовов glXMakeCurrent; исправлено использование pthreads; сокращен оверхед трансляции D3D->GL путем переписывания самых горячих мест; улучшен dirty range tracking; добавлен отдельный однородный массив для базовых матриц; улучшено обновление динамических буферов и оптимизации настроек компилятора. Наиболее полезными в плане улучшения производительности было использование опции компилятора "-ffast-math" и отключение опции "-fPIC".
Полный текст статьи читайте на OpenNet