Oil Rush глазами программиста
Oil Rushглазами программиста
Кто такой?● В геймдеве больше трёх лет● Две выпущенных коммерческих игры
○ Alien Hallway○ Oil Rush
● Принимаю активное участие в ЛШЮП● Программировал ещё в детстве● Активно играю в игры (инди и с графоном)● Море позитива, дома два кота
Об игре
Об игре
Об игре
Oil RushСтруктура проекта
Цифры● 2.5 года разработки● 2 — 5 программистов full time● 135 kloc, 0 строк кода на С++● Вся игра на UnigineScript● Движок в качестве технологии● Платформы:
WindowsLinuxMacPlaystation 3 (в разработке)Мобильная версия (в разработке)
UnigineScript● Кроссплатформенность● Быстрые итерации над кодом● Синтаксис похож на С++● Удобное API движка (~4000 функций)● Toolset● Быстрая 3D математика
UnigineScript
UnigineScript
Структура репозитория
Oil Rush/assets/branches/build/retail/tags/trunk
Unigine
Enginebinaries & plugins
Структура репозитория● Исходники движка в другом репозитории● Отдельное место для финальных билдов● Размер всего репозитория: 353 GB● Размер рабочей копии: 10 GB● Художники не дружат с Source Control
Content Pipeline
Textures(.psd)
Models & Animations
Skinned meshes(.smesh)
Meshes(.mesh)
Animations(.sanim)
Textures(.tga, .png)
DCC Exporter
Uncompressed
Textures(.dds)
Compressed by engine
Content Pipeline
Music(.oga)
Sounds(.oga)
Video(.ogv)
OGG/Vorbis & OGG/Theora
Music(.wav)
Sounds(.wav)
Video(.avi)
Content Pipeline
Локализация● Языки
АнглийскийРусскийНемецкийЯпонский (не осилили)
● Локализуемые ресурсы○ Тексты (~1400 строк)○ Текстуры (~120 файлов)○ Озвучка (~400 файлов)○ Субтитры к видео (10 файлов)
Локализация● Отдельная большая база данных для
локализации (.xml)● Конвертация базы данных в различные
форматы● Самописный тул для генерации
локализованных картинок● XSLT + Python● Верификация
Локализация● Большая куча одинаковых ресурсов, как
следствие ветвление в коде
● Победили модификаторами на файлы:some_texture.ddssome_texture.ru.ddssome_texture.de.dds
● Файловая система автоматически загружает нужные ресурсы
Локализация
Локализация
Выводы● Быстрые итерации над кодом упрощают
жизнь и сильно ускоряют работу
● Задумывайтесь о локализации заранее
● Облегчайте жизнь художникам
Oil RushОптимизация
Источники проблем● Большие бои с кучей юнитов
○ Бои 100 на 100○ У юнитов может быть несколько орудий○ Много разных типов юнитов
● Много подсистем○ AI○ UI○ Unit Manager○ Collision Manager
● Много аллокаций памяти● Долгая загрузка
Правильная линейкаЭто залог успеха!
Правильная линейка● Top 10 script functions
● Top 10 engine functions
Правильная линейка● Железо
○ CPU AMD Athlon II X2 240 2.8 Ghz○ 4 GB RAM○ NVIDIA GeForce GTX 460
● Производительность○ Общая ~20-40 ms○ Игровая логика ~10-17ms○ Рендеринг ~12-23ms○ 5000 DIPS, 1.5m tris
● Память○ ~235 MB Heap○ ~150 MB Video memory
Правильная линейка● Выявление проблемных мест на
реальных картах● Профилирование подсистем скрипта● Мета-описание для тестовых сцен (.xml)● Все замеры на тестовых сценах, без
влияния внешней среды● Сложно измерять спайки
Производительность● Общая оптимизация
○ Игровая логика с фиксированным fps○ Обновление визуальной части отдельно от
игровой логики в другом потоке○ Лимиты на количество
эффектов/платформ/юнитов
● Логика юнита○ Не считали орудия, если рядом никого нет○ Размазали логику юнита на несколько игровых
тактов○ Вынесли прицеливание в отдельную подсистему
Производительность● Низкий уровень
○ Уменьшили количество jmp в критичных местах○ Склеивали несколько asm команд в одну,
улучшили кодогенератор скрипта○ Выносили инварианты из циклов
Производительность
Производительность● Интерфейс
○ Кешировали внутреннее состояние и обновляли по необходимости
○ Размазали обновление○ Сократили с 6ms до 0.5ms
● Управление○ Кешировали состояние устройств ввода○ Размазали время создания кеша команд○ Создание кеша сократилось со 170ms до 1ms на
такт игровой логики
Производительность● Скорость загрузки
○ Все библиотеки материалов загружаются один раз на старте
○ Создание скомпилированного варианта скрипта○ Умный менеджмент ресурсов в движке
Память● Много аллокаций во время боёв
○ Ограничили количество создаваемых эффектов○ Переиспользование объектов вместо удаления○ Свой memory manager в движке○ Сократили с 2000 до 300-500 аллокаций в пике
Память● Влезаем на Playstation 3
○ Убрали pre-load всех объектов, загружаем только нужное
○ Компрессия текстур для интерфейса○ Убрали информацию о геометрии из системной
памяти, храним только в видеопамяти○ Downscale всех текстур○ Пережатый в худшее качество звук○ Выкинут нулевой LOD у геометрии
Выводы● Всё, что не видно — не считать и не
показывать
● В первую очередь алгоритмическая оптимизация, а потом уже technical tricks
● В большинстве случаев подсистемы можно обновлять не каждый такт
Oil RushСборки
Continuous Integration● Team City● Отдельное место для финальных билдов● Синхронизация с trunk/branch● Сборка под различные платформы
Steam (Windows/Mac)Desura (Windows/Linux)Ubuntu Software Center (Linux)Standalone (Windows/Linux/Mac)Linux Native (DEB/RPM)Retail версия для издателя
Continuous Integration
Continuous Integration● Full build with sync ~ 1h● 3 build agents● Shell/bat/python для сборки Oil Rush● Shell/bat/python + scons для сборки
движка● Локальный Content Server для Steam
QA● Trac в качестве багтрекера● Автоматическое развёртывание сборок
для Steam● Очень сложно отслеживать изменения в
игровой логике● Сложно автоматизировать
Недельные релизы● Ранний выпуск игры в бета-тест● Нужно поддерживать более менее
стабильную версию● Специальный раздел на форуме для
багов● Комьюнити в помощь!
Выводы● Дружите с continuous integration
● Тестируйте только то, что собираетесь отдавать пользователям
● Старайтесь не допускать unstable коммитов в билд
Вопросы?twitter: @aviktorov mail: [email protected]://oilrush-game.com/