Архитектурные особенности систем разработки консольных и многоплатформенных игр Руслан Абдикеев Jaleco Entertainment mailto: ruslan@vr1.spb.ru

Презентация:



Advertisements
Похожие презентации
OpenGL и Direct3D сравнение стандартов Выполнил: Пенкин А. Группа И-204.
Advertisements

Объектно-ориентированный подход в языке C#. Класс в языке C# - ссылочный тип, определенный пользователем. Для классов ЯП C# допустимо только единичное.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Пользовательский интерфейс для нескольких проектов Александр Веселов.
Распределение памяти. Динамическое выделение памяти.
Теория языков программирования и методы трансляции Тема 8 Генерация кода.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Применение генетических алгоритмов для генерации тестов к олимпиадным задачам по программированию Буздалов М.В., СПбГУ ИТМО.
Операционные системы и среды. Схема устройства жесткого диска Дорожка N Сектор (блок) Пластина 1 Пластина 2 Цилиндр 0 сторона Диск – одна или несколько.
Разработка сред управляемого исполнения на примере виртуальной машины Java Занятие 2 Салищев С.И.
Система фрагментированного программирования Перепелкин В.А. Всероссийская молодежная школа по параллельному программированию МО ВВС ИВМиМГ 2009 г.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
Решения виртуализации для IT Платонов Евгений. Технологические тенденции архитектуры x86 Многоядерные процессоры развиваются 2 ядра в , 4 ядра в.
1 Диаграммы реализации (implementation diagrams).
Классы в C#. Две роли классов Класс Класс – это модуль, архитектурная единица построения программной системы. Модульность построения – основное свойство.
Дружественные функции Дружественные функции – это функции, объявленные вне класса, но имеющие доступ к закрытым и защищенным полям данного класса Дружественная.
Транксрипт:

Архитектурные особенности систем разработки консольных и многоплатформенных игр Руслан Абдикеев Jaleco Entertainment mailto:

Системы разработки игр Задачи и характеристики Задачи и характеристики Типичные архитектурные решения Типичные архитектурные решения Ключевые проблемы Ключевые проблемы Пути решения проблем Пути решения проблем Примеры Примеры

Уточнение Разработка консольных или кроссплатформенных игр – огромная тема Разработка консольных или кроссплатформенных игр – огромная тема Планирование Планирование Организация производственного процесса Организация производственного процесса Подготовка контента Подготовка контента Переносимость кода и функциональности Переносимость кода и функциональности Ограничения конкретных консолей Ограничения конкретных консолей Различия в TCR/TRC Различия в TCR/TRC

Уточнение (2) Консоли предъявляют жесткие требования к распределению ресурсов во время игры Консоли предъявляют жесткие требования к распределению ресурсов во время игры Консольные игры предполагают более жесткий quality assurance и более жесткие требования к целостности контента Консольные игры предполагают более жесткий quality assurance и более жесткие требования к целостности контента Решения, применяемые в современных технологических цепочках, не лучшим образом сказываются на масштабируемости и производительности движка Решения, применяемые в современных технологических цепочках, не лучшим образом сказываются на масштабируемости и производительности движка

Уточнение (3) Основные темы: Основные темы: Снижение накладных расходов при сохранении гибкости и расширяемости архитектуры Снижение накладных расходов при сохранении гибкости и расширяемости архитектуры Способы эффективного представления контента в памяти и на диске Способы эффективного представления контента в памяти и на диске Механизмы настройки контента Механизмы настройки контента Вопросы гарантии целостности ресурсов Вопросы гарантии целостности ресурсов Большая часть материала применима и к разработке игры для одной платформы, в частности, для PC Большая часть материала применима и к разработке игры для одной платформы, в частности, для PC

Мотивы создания систем разработки игр Отраслевые тенденции Отраслевые тенденции Ожидания потребителей Ожидания потребителей Требования издателей Требования издателей

Мотивация: отраслевые тенденции Стремительное развитие технологий Стремительное развитие технологий Резкое усложнение игрового контента Резкое усложнение игрового контента Самые разнообразные платформы Самые разнообразные платформы «Переход количества в качество» «Переход количества в качество» Вытеснение «гаражных» методов разработки промышленными Вытеснение «гаражных» методов разработки промышленными

Мотивация: ожидания потребителей Покупают не технологию, а контент Покупают не технологию, а контент Но ожидают кинематографическое качество Но ожидают кинематографическое качество Большой и сложный мир, живущий сам по себе Большой и сложный мир, живущий сам по себе Выразительные и эмоциональные персонажи Выразительные и эмоциональные персонажи Предельная интерактивность Предельная интерактивность Поведение, анимация, звук, изображение… Поведение, анимация, звук, изображение…

Мотивация: требования издателей Минимум рисков, связанных с производством Минимум рисков, связанных с производством Сокращение цикла разработки для ускорения выхода на рынок Сокращение цикла разработки для ускорения выхода на рынок Повторная используемость контента (перенос на другие платформы, сиквелы) Повторная используемость контента (перенос на другие платформы, сиквелы) Разумный бюджет Разумный бюджет Поддержка новых технологий - подразумевается Поддержка новых технологий - подразумевается

Характеристики системы разработки игр Простота внедрения Простота внедрения Гибкость и расширяемость Гибкость и расширяемость Масштабируемость Масштабируемость Производительность Производительность

Задачи: простота внедрения Быстрое обучение Быстрое обучение Простые, но мощные средства Простые, но мощные средства Единообразные инструменты Единообразные инструменты Автоматизация рутинных процессов Автоматизация рутинных процессов Продвинутые средства отладки контента Продвинутые средства отладки контента

Задачи: гибкость, расширяемость Простота настройки контента Простота настройки контента Изменение данных «в последний момент» Изменение данных «в последний момент» Внедрение новых технологий в сжатые сроки Внедрение новых технологий в сжатые сроки Быстрая проверка идей без цикла разработки/внедрения Быстрая проверка идей без цикла разработки/внедрения

Задачи: масштабируемость Большие и сверхбольшие размеры контента Большие и сверхбольшие размеры контента Параллельное создание контента Параллельное создание контента Параллельная разработка нескольких игр Параллельная разработка нескольких игр Поддержка нескольких платформ Поддержка нескольких платформ Поддержка нескольких жанров Поддержка нескольких жанров

Задачи: производительность технологической цепочки Четкое разграничение проблем Четкое разграничение проблем Разделение труда Разделение труда Принцип «наиболее квалифицированного специалиста» Принцип «наиболее квалифицированного специалиста» Уменьшение «зацепок» и простоев Уменьшение «зацепок» и простоев Сбалансированное распределение ответственности Сбалансированное распределение ответственности Сокращение цикла разработки Сокращение цикла разработки

Задачи: производительность движка Еще раз: большие и сверхбольшие размеры контента Еще раз: большие и сверхбольшие размеры контента Еще раз: сложный мир, живущий сам по себе Еще раз: сложный мир, живущий сам по себе Мощные средства оптимизации контента Мощные средства оптимизации контента Предсказуемое время отклика движка Предсказуемое время отклика движка Быстрая фоновая загрузка контента Быстрая фоновая загрузка контента

Типичные архитектурные решения Абстрагирование, расцепление (decoupling) Абстрагирование, расцепление (decoupling) Компонентные архитектуры Компонентные архитектуры Архитектуры, управляемые данными Архитектуры, управляемые данными Скрипты Скрипты Обобщенный формат хранения контента Обобщенный формат хранения контента «Добавление уровня косвенности решает большинство проблем» «Добавление уровня косвенности решает большинство проблем»

Компонентные архитектуры Подключаемые (plug-in) модули Подключаемые (plug-in) модули Сложные динамические системы из простых компонент Сложные динамические системы из простых компонент Построение платформы для будущих расширений Построение платформы для будущих расширений

Компонентные архитектуры (2) Уменьшение «зацепления» кода Уменьшение «зацепления» кода Повторное использование компонент Повторное использование компонент Много игр – одна кодовая база Много игр – одна кодовая база Композиция компонент – комбинаторный взрыв возможностей Композиция компонент – комбинаторный взрыв возможностей

Data driven архитектуры Инкапсуляция структуры игрового мира и настроек его компонентов Инкапсуляция структуры игрового мира и настроек его компонентов Основное время разработки игры – создание контента и его настройка Основное время разработки игры – создание контента и его настройка Игра – база данных, не надо фиксировать ее в коде Игра – база данных, не надо фиксировать ее в коде Оставьте программистов в покое! Оставьте программистов в покое! Быстрый цикл идея-проверка-внедрение Быстрый цикл идея-проверка-внедрение

Data driven архитектуры (2) Данными легче управлять, чем кодом Данными легче управлять, чем кодом У данных меньше «зацепление», чем у кода У данных меньше «зацепление», чем у кода Схема: объект = шаблон + настройки Схема: объект = шаблон + настройки Жестче схема – меньше ошибок Жестче схема – меньше ошибок Данные легче поддаются автоматической обработке: сборке ресурсов, переносу на другие платформы Данные легче поддаются автоматической обработке: сборке ресурсов, переносу на другие платформы

Data driven архитектуры (3) Единообразные инструменты Единообразные инструменты Меньше инструментов – больше областей их применения Меньше инструментов – больше областей их применения Композиция атрибутов и структурная композиция – комбинаторный взрыв возможностей Композиция атрибутов и структурная композиция – комбинаторный взрыв возможностей

Скрипты Инкапсуляция поведения элементов системы Инкапсуляция поведения элементов системы Мы даже код сделаем данными Мы даже код сделаем данными Оставьте программистов в покое! Оставьте программистов в покое! Быстрый цикл идея-проверка-внедрение Быстрый цикл идея-проверка-внедрение

Скрипты (2) Высокоуровневые примитивы языка, специфичные для игровых задач Высокоуровневые примитивы языка, специфичные для игровых задач Естественный доступ к функциональности движка Естественный доступ к функциональности движка Виртуальная машина, компактное представление, JIT-компиляция Виртуальная машина, компактное представление, JIT-компиляция Перенос на другие платформы Перенос на другие платформы

Обобщенный формат хранения Сериализация/десериализация Сериализация/десериализация Компоненты + данные Компоненты + данные Все равно, что, где и как хранить Все равно, что, где и как хранить Единообразие и прозрачность Единообразие и прозрачность Некоторые гарантии целостности Некоторые гарантии целостности

Результаты Вроде бы, все хорошо Вроде бы, все хорошо Гибкость, расширяемость Гибкость, расширяемость Производительность технологической цепочки Производительность технологической цепочки Единообразный подход к компонентам игрового мира и их атрибутам Единообразный подход к компонентам игрового мира и их атрибутам Но… Но…

Пиррова победа? Чрезмерная общность Чрезмерная общность Высокие издержки, «over engineering» Высокие издержки, «over engineering» Неформальные «договоренности» Неформальные «договоренности» Явные спецификации недостаточно формализованы или отсутствуют Явные спецификации недостаточно формализованы или отсутствуют Связи кода со внутренней структурой 3D моделей и сцен Связи кода со внутренней структурой 3D моделей и сцен Что и как часто мы будем изменять или использовать Что и как часто мы будем изменять или использовать Естественные последствия требований гибкости и расширяемости Естественные последствия требований гибкости и расширяемости

Пиррова победа? (2) Еще раз: большой и сложный мир… Еще раз: большой и сложный мир… Высокая степень детализации контента Высокая степень детализации контента Какова цена единообразного подхода к атрибутам системы? Какова цена единообразного подхода к атрибутам системы? «Грубый помол»? «Грубый помол»? Масштабируемость тех. цепочки? Масштабируемость тех. цепочки? Масштабируемость движка? Масштабируемость движка? Какова цена неформальных договоренностей? Какова цена неформальных договоренностей? Целостность ресурсов? Целостность ресурсов? Масштабируемость тех. цепочки? Масштабируемость тех. цепочки? Производительность движка? Производительность движка?

Два детальных примера Хранение 3D сцен на диске и их представление в памяти Хранение 3D сцен на диске и их представление в памяти Настройка контента и доступ к параметрам игровых объектов из игры Настройка контента и доступ к параметрам игровых объектов из игры

Case 1: представление 3D моделей Типичные схемы: Типичные схемы: Монолитное представление Монолитное представление Слишком жесткое, но эффективное Слишком жесткое, но эффективное Открытое (компонентное) представление Открытое (компонентное) представление Слишком гибкое, но расточительное и хрупкое Слишком гибкое, но расточительное и хрупкое Нам нужна золотая середина Нам нужна золотая середина Не платим за то, что не используем Не платим за то, что не используем Требуем гарантий целостности Требуем гарантий целостности

3D: монолитное представление «Классика жанра»: Quake «Классика жанра»: Quake При разработке движка фиксируется набор управляемых атрибутов конкретных моделей (как правило, только скины и анимации) При разработке движка фиксируется набор управляемых атрибутов конкретных моделей (как правило, только скины и анимации) Жесткие правила именования (тэги или имена подобъектов) Жесткие правила именования (тэги или имена подобъектов) При экспорте – преобразование в жестко заданный для этого типа моделей формат (Quake.MD3 для моделей игроков, например) При экспорте – преобразование в жестко заданный для этого типа моделей формат (Quake.MD3 для моделей игроков, например) У моделей не может быть развитой внутренней структуры У моделей не может быть развитой внутренней структуры нет разнородных атрибутов – нет проблемы нет разнородных атрибутов – нет проблемы

3D: открытое представление Scene graph, DAG, дерево подобъектов Scene graph, DAG, дерево подобъектов Доступны все атрибуты всех объектов в иерархии (в т.ч. атрибуты шейдеров) Доступны все атрибуты всех объектов в иерархии (в т.ч. атрибуты шейдеров) Разнородные (гетерогенные) данные Разнородные (гетерогенные) данные Обобщенный, независимый от типа модели и target платформы формат Обобщенный, независимый от типа модели и target платформы формат Произвольный доступ к модели со стороны игровых объектов Произвольный доступ к модели со стороны игровых объектов Как правило, компонентная архитектура Как правило, компонентная архитектура

3D: открытое представление (2) Существуют правила именования подобъектов и их атрибутов Существуют правила именования подобъектов и их атрибутов Чаще всего, неявные правила («изустное творчество»), поскольку игровой код отделен от инструментов по созданию контента Чаще всего, неявные правила («изустное творчество»), поскольку игровой код отделен от инструментов по созданию контента Неявные правила – неформальные договоренности Неявные правила – неформальные договоренности

3D: открытое представление (3) «Слишком» гибкое представление «Слишком» гибкое представление Наши намерения не выражены явно Наши намерения не выражены явно Весь спектр классических проблем ОО: Весь спектр классических проблем ОО: Некомпактное представление объектов Некомпактное представление объектов Медленная загрузка Медленная загрузка Обилие перераспределений памяти Обилие перераспределений памяти Фрагментация памяти Фрагментация памяти Высокий расход памяти и медленное копирование объектов: движок не знает, какие данные мы можем изменить Высокий расход памяти и медленное копирование объектов: движок не знает, какие данные мы можем изменить

3D: открытое представление (4) Статические объекты могут быть представлены более эффективно Статические объекты могут быть представлены более эффективно Но оптимизатор не знает, что мы будем изменять Но оптимизатор не знает, что мы будем изменять Нет гарантий целостности ресурсов Нет гарантий целостности ресурсов Пока есть «неформальные договоренности», автоматическая проверка целостности невозможна Пока есть «неформальные договоренности», автоматическая проверка целостности невозможна

3D: открытое представление (5) Игровой код: уродлив, неэффективен, подвержен ошибкам Игровой код: уродлив, неэффективен, подвержен ошибкам // получение бокса левого закрылка render::node n = Plane.find_node_recursive(FlapsLeft); assert( n != null ); render::mesh m = (render::mesh)n.get_robject(); assert( m != null ); render::box b = m.get_box(); Заранее известно, что левый закрылок должен присутствовать в модели Заранее известно, что левый закрылок должен присутствовать в модели Известно, что нужен только бокс закрылка Известно, что нужен только бокс закрылка

3D: открытое представление (6) Игровой код: хотелось бы что-то подобное: Игровой код: хотелось бы что-то подобное: // получение бокса левого закрылка render::box b = Plane.FlapsLeft.box; Более красиво, более эффективно Более красиво, более эффективно Целостность данных должна проверяться раньше, не во время исполнения Целостность данных должна проверяться раньше, не во время исполнения

Вседозволенность против гибкости Абстрагирование и позднее связывание вызывают потери неявной информации о структуре связей кода с контентом Абстрагирование и позднее связывание вызывают потери неявной информации о структуре связей кода с контентом Она как бы есть, но скрытая, недоступная для внешних (управляемых данными) инструментов Она как бы есть, но скрытая, недоступная для внешних (управляемых данными) инструментов Для консольных игр такие потери плюс «неформальные договоренности» могут стать фатальными Для консольных игр такие потери плюс «неформальные договоренности» могут стать фатальными Сходная проблема есть в языках программирования как оборотная сторона ОО и как пример «abstraction penalty» Сходная проблема есть в языках программирования как оборотная сторона ОО и как пример «abstraction penalty»

Вседозволенность: Стек на C# class Stack { public void Push( object item ); public object Pop(); } Stack s = new Stack(); s.Push( (object)123 ); int n = (int)s.Pop(); Слишком гибок: стек любых объектов Слишком гибок: стек любых объектов Не соответствует задаче: нам нужен стек int Не соответствует задаче: нам нужен стек int Дорог и некрасив: преобразование в/из objectа Дорог и некрасив: преобразование в/из objectа Не дает гарантий целостности: о несоответствии типов станет известно только в run-time Не дает гарантий целостности: о несоответствии типов станет известно только в run-time

Гибкость: Стек на C# с Generics class Stack { public void Push( T item ); public T Pop(); } Stack s = new Stack (); s.Push( 123 ); int n = s.Pop(); «Заточенность»: стек int – ровно то, что нужно «Заточенность»: стек int – ровно то, что нужно Эффективность: нет преобразований Эффективность: нет преобразований Целостность: ошибки типов диагностируются во время компиляции Целостность: ошибки типов диагностируются во время компиляции

3D: явная параметризация Явная параметризация типов в языках программирования переносит время связывания на момент компиляции и дает: Явная параметризация типов в языках программирования переносит время связывания на момент компиляции и дает: Эффективность Эффективность Удобство Удобство Гарантии целостности Гарантии целостности При этом сохраняя гибкость и расширяемость При этом сохраняя гибкость и расширяемость

3D: открытое представление (7) // получение бокса левого закрылка render::box b = Plane.FlapsLeft.box; Это не должен быть «синтаксический сахар» скриптового языка, скрывающий неэффективную и хрупкую реализацию Это не должен быть «синтаксический сахар» скриптового языка, скрывающий неэффективную и хрупкую реализацию Это должно быть именно представление модели в памяти, поэтому результаты должны быть применимы и к C++ коду Это должно быть именно представление модели в памяти, поэтому результаты должны быть применимы и к C++ коду Перенос времени связывания с run-time на момент компиляции кода (compile-time) и на момент сборки ресурсов (bundler-time) Перенос времени связывания с run-time на момент компиляции кода (compile-time) и на момент сборки ресурсов (bundler-time) Ранняя и 100% диагностика ошибок Ранняя и 100% диагностика ошибок

3D: явная параметризация (2) Введем в движок описание 3D моделей: Введем в движок описание 3D моделей: game FighterAce { scene Plane { instance LaGG3 ЛаГГ-3; instance P38L P-38L; readonly FlapsLeft.box = Mesh(FlapsLeft).Box; } Описание задает как атрибуты объектов, используемые/модифицируемые игровым кодом, так и требования к 3D моделям Описание задает как атрибуты объектов, используемые/модифицируемые игровым кодом, так и требования к 3D моделям

3D: явная параметризация (3) Для архитектур, управляемых данными, – это естественный шаг Для архитектур, управляемых данными, – это естественный шаг Требования к модели используются при экспорте, оптимизации и сборке ресурсов Требования к модели используются при экспорте, оптимизации и сборке ресурсов Информация о связях игрового кода с 3D моделью используется для формирования эффективного memory layout и удобного интерфейса к объекту Информация о связях игрового кода с 3D моделью используется для формирования эффективного memory layout и удобного интерфейса к объекту

3D: назад к монолитам Фактически, мы возвращаемся к «жестким» монолитным форматам хранения 3D моделей Фактически, мы возвращаемся к «жестким» монолитным форматам хранения 3D моделей Автоматически генерируемые форматы, «заточенные» под конкретную комбинацию модель-платформа Автоматически генерируемые форматы, «заточенные» под конкретную комбинацию модель-платформа Работа с этими форматами происходит прозрачно и полностью автоматически для игрового кода Работа с этими форматами происходит прозрачно и полностью автоматически для игрового кода Внутренние атрибуты моделей доступны в естественной для игрового кода форме Внутренние атрибуты моделей доступны в естественной для игрового кода форме

3D: memory layout В соответствии с описанием 3D модели, все ее атрибуты разбиваются на два класса: В соответствии с описанием 3D модели, все ее атрибуты разбиваются на два класса: Разделяемые атрибуты, общие для всех копий Разделяемые атрибуты, общие для всех копий Копируемые атрибуты, в частности, атрибуты, изменяемые игровым кодом Копируемые атрибуты, в частности, атрибуты, изменяемые игровым кодом Мы можем распределить всю 3D модель (исключая ресурсы рендера) в два непрерывных участка памяти Мы можем распределить всю 3D модель (исключая ресурсы рендера) в два непрерывных участка памяти Компактное, cache friendly представление Компактное, cache friendly представление Идеально для фоновой загрузки и копирования Идеально для фоновой загрузки и копирования

3D: детали Автоматически генерируемый для игровых объектов интерфейс работы с 3D моделью (общая идея): Автоматически генерируемый для игровых объектов интерфейс работы с 3D моделью (общая идея): class Plane : public render::u_object { public: struct FlapsLeft_t { render::box8 box; }; enum instance_t { LaGG3, P38L } instance; FlapsLeft_t FlapsLeft; static Plane* Load( instance_t inst ); Plane* Copy() const; void Destroy(); };

3D: детали (2) Формат представления конкретной модели определяется файлом описания и собственно содержимым 3D сцены Формат представления конкретной модели определяется файлом описания и собственно содержимым 3D сцены Для каждого файла описания генерируется.h и.cpp Для каждого файла описания генерируется.h и.cpp.cpp – assertions и зависящий от описания модели код.cpp – assertions и зависящий от описания модели код На диске данные представлены в готовом к употреблению виде (относительная адресация) с таблицей fix up На диске данные представлены в готовом к употреблению виде (относительная адресация) с таблицей fix up Загрузка – чтение с диска в непрерывный участок памяти, применение fix up и создание C++ объектов (placement new) Загрузка – чтение с диска в непрерывный участок памяти, применение fix up и создание C++ объектов (placement new)

3D: детали (3) Движок (включая рендер) работает со структурой, близкой к scene graph Движок (включая рендер) работает со структурой, близкой к scene graph Объекты движка не имеют фиксированного memory layout (любой атрибут может попасть в пользовательскую область) Объекты движка не имеют фиксированного memory layout (любой атрибут может попасть в пользовательскую область) Адресация через аналог v-table Адресация через аналог v-table Тем не менее, естественная C++ нотация (благодаря средствам языка вроде template) Тем не менее, естественная C++ нотация (благодаря средствам языка вроде template) Скорость работы движка выше из-за дружественной к кэшу структуры Скорость работы движка выше из-за дружественной к кэшу структуры

3D: голые факты Считаем только пользовательскую часть, без звуков и 3D ресурсов Считаем только пользовательскую часть, без звуков и 3D ресурсов Не самый худший случай Не самый худший случай Один самолет B-17 (без панели кабины) Один самолет B-17 (без панели кабины) Около 50 подобъектов, анимированных художниками Около 50 подобъектов, анимированных художниками Около 100 атрибутов, изменяемых из игры (преимущественно матрицы трансформации, флаги видимости, контроллеры анимаций) Около 100 атрибутов, изменяемых из игры (преимущественно матрицы трансформации, флаги видимости, контроллеры анимаций)

3D: голые факты Вседозволенность: Вседозволенность: Одна копия: около 80K в 140 блоках Одна копия: около 80K в 140 блоках Разделяемые данные: около 700K в 170 блоках Разделяемые данные: около 700K в 170 блоках Создание копии на PC вызывает легкие лаги и swap при недостаточном объеме памяти Создание копии на PC вызывает легкие лаги и swap при недостаточном объеме памяти Применялись аллокаторы, умные указатели и т.п. Применялись аллокаторы, умные указатели и т.п. Гибкость с явными намерениями: Гибкость с явными намерениями: Одна копия: 12K в 1 блоке Одна копия: 12K в 1 блоке Разделяемые данные: 256K в 1 блоке Разделяемые данные: 256K в 1 блоке Прямое чтение с диска с последующим fix up Прямое чтение с диска с последующим fix up Скорость копирования сравнима с memcpy() Скорость копирования сравнима с memcpy() Никаких аллокаторов (выделение по 4K) Никаких аллокаторов (выделение по 4K) Никаких умных указателей Никаких умных указателей

Case 1: результаты Высокая производительность Высокая производительность Минимальные требования к ресурсам Минимальные требования к ресурсам Отсутствие сложного lifetime management Отсутствие сложного lifetime management Эффективная работа с памятью Эффективная работа с памятью Полностью автоматическая сборка Полностью автоматическая сборка 100% гарантии целостности ресурсов 100% гарантии целостности ресурсов Ясный, простой и эффективный игровой код Ясный, простой и эффективный игровой код Сохранены гибкость и расширяемость Сохранены гибкость и расширяемость

Case 1: заключение Обобщенный формат используется для хранения и трансформаций контента Обобщенный формат используется для хранения и трансформаций контента Сборщик ресурсов Сборщик ресурсов Выполняет низкоуровневую оптимизацию под конкретную платформу в соответствии с описанием модели и конкретной 3D сценой Выполняет низкоуровневую оптимизацию под конкретную платформу в соответствии с описанием модели и конкретной 3D сценой Записывает в низкоуровневом формате, «заточенном» под 3D сцену и платформу Записывает в низкоуровневом формате, «заточенном» под 3D сцену и платформу Игра работает с семейством низкоуровневых форматов Игра работает с семейством низкоуровневых форматов Это происходит автоматически и прозрачно для игрового кода и разработчиков Это происходит автоматически и прозрачно для игрового кода и разработчиков

Case 2: настройка контента Художник создает модель и указывает ее рабочие характеристики Художник создает модель и указывает ее рабочие характеристики Игровой код активно использует данные, специфичные для данной модели (мы предполагаем доступ к настройкам «только для чтения») Игровой код активно использует данные, специфичные для данной модели (мы предполагаем доступ к настройкам «только для чтения») Требования Требования Гарантии корректности данных Гарантии корректности данных Эффективный и удобный доступ к данным Эффективный и удобный доступ к данным Автоматическая обратная совместимость Автоматическая обратная совместимость

Настройка: о чем речь? В идеале, художник прямо в пакете моделирования указывает параметры: В идеале, художник прямо в пакете моделирования указывает параметры:

Настройка: о чем речь? (2) Для отладки и тестирования настройки могут быть вынесены в текстовые файлы Для отладки и тестирования настройки могут быть вынесены в текстовые файлы Как XML: Как XML: Или как любой другой удобный формат: Или как любой другой удобный формат: GunControl : PLANE_GUN { AmmoModel = "Bullets/ammo" MinDistance = 4.5 MaxDistance = FullAmmoPack = 400 }

Настройка: о чем речь? (3) Впрочем, стандартный инструмент удобнее: Впрочем, стандартный инструмент удобнее:

Настройка: о чем речь? (3) Игровому коду эта информация должна быть доступна естественными (языковыми) средствами: Игровому коду эта информация должна быть доступна естественными (языковыми) средствами:

Настройка: типичные схемы Пары «имя» – «значение» Пары «имя» – «значение» Предельная гибкость, хрупкость и неэффективность Предельная гибкость, хрупкость и неэффективность Громоздкий код Громоздкий код Сериализация/десериализация Сериализация/десериализация Ясный и надежный код Ясный и надежный код Гарантии целостности Гарантии целостности Потенциально – гибкость, расширяемость и эффективность Потенциально – гибкость, расширяемость и эффективность

Настройка: сериализация Сериализация/десериализация Сериализация/десериализация Описание библиотек типов Описание библиотек типов Инструменты для редактирования Инструменты для редактирования Сборщик, выполняющий проверку валидности входных данных и сериализацию в финальный формат Сборщик, выполняющий проверку валидности входных данных и сериализацию в финальный формат Если в системе разработки есть такие возможности, это уже хорошо! Если в системе разработки есть такие возможности, это уже хорошо!

Настройка: подводные камни Обратная совместимость и расширяемость схемы Обратная совместимость и расширяемость схемы Эффективное представление в runtime Эффективное представление в runtime Быстрая загрузка Быстрая загрузка Минимальный расход памяти Минимальный расход памяти

Настройка: обратная совместимость Следует отличать «значения по умолчанию» от введенных значений Следует отличать «значения по умолчанию» от введенных значений Это позволит изменить значения по умолчанию сразу для большого класса объектов Это позволит изменить значения по умолчанию сразу для большого класса объектов Экземпляр = шаблон + переопределенные значения Экземпляр = шаблон + переопределенные значения Готовность к расширению схемы Готовность к расширению схемы

Настройка: применение шаблонов Явное описание структуры компонента Явное описание структуры компонента Указываются типы и значения по умолчанию Указываются типы и значения по умолчанию Не имеющие умолчаний поля являются обязательными Не имеющие умолчаний поля являются обязательными

Настройка: применение шаблонов (2) Конкретный экземпляр компонента «наследуется» от шаблона и переопределяет значения полей Конкретный экземпляр компонента «наследуется» от шаблона и переопределяет значения полей Обязательны значения обязательных полей Обязательны значения обязательных полей Нельзя вводить новые поля Нельзя вводить новые поля Нельзя указывать тип полей Нельзя указывать тип полей

Настройка: применение шаблонов (3) Можно использовать промежуточные шаблоны (единица крупных замен значений по умолчанию) Можно использовать промежуточные шаблоны (единица крупных замен значений по умолчанию) Промежуточные шаблоны «наследуются» от других шаблонов и переопределяют значения полей Промежуточные шаблоны «наследуются» от других шаблонов и переопределяют значения полей Нельзя вводить новые поля Нельзя вводить новые поля Нельзя указывать тип полей Нельзя указывать тип полей

Настройка: библиотека типов Чтение всех «корневых» шаблонов (их изменение, как правило, производит игровой программист) Чтение всех «корневых» шаблонов (их изменение, как правило, производит игровой программист) Генерация библиотек типов для внешних (управляемых данными) инструментов Генерация библиотек типов для внешних (управляемых данными) инструментов Генерация C++ описаний компонентов для эффективной работы в runtime конкретной платформы Генерация C++ описаний компонентов для эффективной работы в runtime конкретной платформы

Настройка: библиотека типов (2) Пример сгенерированного C++ объявления: Пример сгенерированного C++ объявления: struct PLANE_GUN { render::obj_ref AmmoModel; float MinDistance; float MaxDistance; int FullAmmoPack; sdf::t_carray g_Other; };

Настройка: редактирование Расширяемый набор управляющих элементов для платформы разработчика (PC, Win32) Расширяемый набор управляющих элементов для платформы разработчика (PC, Win32) Стандартные механизмы библиотеки типов и сериализации/десериализации Стандартные механизмы библиотеки типов и сериализации/десериализации Возможность создавать промежуточные шаблоны Возможность создавать промежуточные шаблоны Явная визуальная дифференциация значений по умолчанию и явно заданных значений Явная визуальная дифференциация значений по умолчанию и явно заданных значений Работа с больших количеством промежуточных форматов (XML, обобщенные форматы хранения 3D сцен, etc) Работа с больших количеством промежуточных форматов (XML, обобщенные форматы хранения 3D сцен, etc)

Настройка: сборщик Читает все шаблоны и компоненты из промежуточных форматов и библиотек типов Читает все шаблоны и компоненты из промежуточных форматов и библиотек типов Диагностирует разночтения библиотеки типов и «корневых» шаблонов Диагностирует разночтения библиотеки типов и «корневых» шаблонов Формирует полные (плоские) компоненты Формирует полные (плоские) компоненты Диагностирует отсутствующие обязательные поля или поля, отсутствующие в схеме Диагностирует отсутствующие обязательные поля или поля, отсутствующие в схеме При необходимости, формирует дополнительные массивы пар «имя» – «значение» При необходимости, формирует дополнительные массивы пар «имя» – «значение»

Настройка: сборщик (2) Сериализует данные в финальный, зависящий от target платформы, формат Сериализует данные в финальный, зависящий от target платформы, формат Оптимизирует размещение (данные «только для чтения») Оптимизирует размещение (данные «только для чтения») Исключает дубликаты Исключает дубликаты Формирует плоское представление сложных типов (строк, массивов, ресурсных указателей) Формирует плоское представление сложных типов (строк, массивов, ресурсных указателей) В финальном формате данные на диске хранятся в готовом к употреблению виде В финальном формате данные на диске хранятся в готовом к употреблению виде Выделение непрерывной области памяти, чтение с диска, fix up, использование Выделение непрерывной области памяти, чтение с диска, fix up, использование

Настройка: детали Для плоского и относительно-адресуемого представления сложных типов используются те же типы, что и в 3D сценах Для плоского и относительно-адресуемого представления сложных типов используются те же типы, что и в 3D сценах template struct t_carray { // Интерфейс как у константного std::vector const T* begin() const { return ShiftPointer (this, iBegin); } //... private: std::ptrdiff_t iBegin, iEnd; };

Настройка: детали (2) Результирующий (автоматически сгенерированный и библиотечный) код непереносим, а финальные бинарные форматы «заточены» под конкретную пару компилятор-платформа Результирующий (автоматически сгенерированный и библиотечный) код непереносим, а финальные бинарные форматы «заточены» под конкретную пару компилятор-платформа Для другой пары компилятор-платформа будет сгенерирован другой код и построены другие форматы Для другой пары компилятор-платформа будет сгенерирован другой код и построены другие форматы Может быть изменен порядок байт и выполнено строгое выравнивание Может быть изменен порядок байт и выполнено строгое выравнивание Все это произойдет автоматически Все это произойдет автоматически

Case 2: результаты Высокая производительность Высокая производительность Минимальные требования к ресурсам Минимальные требования к ресурсам Эффективная работа с памятью Эффективная работа с памятью Полностью автоматическая сборка Полностью автоматическая сборка 100% гарантии целостности ресурсов 100% гарантии целостности ресурсов Ясный, простой и эффективный игровой код Ясный, простой и эффективный игровой код Сохранены гибкость и расширяемость Сохранены гибкость и расширяемость

Case 2: заключение Обобщенные форматы (XML…) используются для хранения и редактирования контента Обобщенные форматы (XML…) используются для хранения и редактирования контента Сборщик ресурсов Сборщик ресурсов Выполняет низкоуровневую оптимизацию под конкретную платформу в соответствии с описанием «корневых» шаблонов Выполняет низкоуровневую оптимизацию под конкретную платформу в соответствии с описанием «корневых» шаблонов Записывает в низкоуровневом формате, «заточенном» под платформу и компилятор Записывает в низкоуровневом формате, «заточенном» под платформу и компилятор Игра работает с семейством низкоуровневых форматов Игра работает с семейством низкоуровневых форматов Это происходит автоматически и прозрачно для игрового кода и разработчиков Это происходит автоматически и прозрачно для игрового кода и разработчиков

Заключение Мы рассмотрели приемы сохранения гибкости и расширяемости системы в условиях ограниченных ресурсов без потери производительности и масштабируемости Мы рассмотрели приемы сохранения гибкости и расширяемости системы в условиях ограниченных ресурсов без потери производительности и масштабируемости В двух приведенных примерах это достигалось явной демонстрацией намерений со стороны разработчика, что позволяло перенести время связывания с runtime на более ранние моменты В двух приведенных примерах это достигалось явной демонстрацией намерений со стороны разработчика, что позволяло перенести время связывания с runtime на более ранние моменты Благодаря этим приемам мы получали 100% гарантии целостности ресурсов Благодаря этим приемам мы получали 100% гарантии целостности ресурсов

Дальнейшие шаги Без сомнения, подобный подход может быть применен ко многим аспектам построения систем разработки игр Без сомнения, подобный подход может быть применен ко многим аспектам построения систем разработки игр Управление базой данных контента в процессе разработки (SQL и т.п.) Управление базой данных контента в процессе разработки (SQL и т.п.) Управление сложной анимацией (генерация кода вместо набора ключей) Управление сложной анимацией (генерация кода вместо набора ключей) Управление ресурсами и памятью (оптимизация загрузок и переходов между конфигурациями) Управление ресурсами и памятью (оптимизация загрузок и переходов между конфигурациями) Работа с шейдерами (минимизация переключений состояний) Работа с шейдерами (минимизация переключений состояний)

Вопросы? Мой и домашняя страничка Мой и домашняя страничка Компания, в которой я работаю Компания, в которой я работаю