Oil Rush глазами программистов — DevDay, 06.06.2012

Preview:

DESCRIPTION

 

Citation preview

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: unclebob@unigine.comhttp://oilrush-game.com/