54
Разработка под консоли Хорошие и плохие решения Akella. Арсенихин Роман

Разработка под консоли

  • Upload
    wynona

  • View
    34

  • Download
    0

Embed Size (px)

DESCRIPTION

Разработка под консоли. Хорошие и плохие решения Akella. Арсенихин Роман. Попадая на консоли. Мало памяти ... Но другим её хватает Нету быстрого HDD, есть медленный DVD Особенности местного графического процессора весьма непривичны. КРИ 2005. 3 апреля. Платформы. Графические движки. - PowerPoint PPT Presentation

Citation preview

Page 1: Разработка под консоли

Разработка под консолиХорошие и плохие решения

Akella. Арсенихин Роман

Page 2: Разработка под консоли

Попадая на консоли...

• Мало памяти

• ... Но другим её хватает

• Нету быстрого HDD, есть медленный DVD

• Особенности местного графического процессора весьма непривичны

КРИ 2005. 3 апреля.

Page 3: Разработка под консоли

Платформы. Графические движки

КРИ 2005. 3 апреля.

Page 4: Разработка под консоли

Выбор платформ

• Чёткое понимание возможности реализации желаемых features

При выборе нескольких платформ:

• Архитектурная совместимость – не придётся ли писать две реализации одного и того же движка?

КРИ 2005. 3 апреля.

Page 5: Разработка под консоли

Выбор платформПонимание возможностейРазрабатываем революционный FPS? Ок

Требования дизайнеров:• Чтобы у монстров было по 2, 3 или 4 руки.• Чтобы у них из глаз вылетали лучи смерти.• Чтобы был оригинальный режим зрения

сквозь стены.• Чтобы можно было перемещаться по всему

миру без задержек и загрузок.

КРИ 2005. 3 апреля.

Page 6: Разработка под консоли

Выбор платформПонимание возможностейРассуждения программистов:• 2, 3 или 4 руки у монстров? С этим проблем нет, наш

универсальный движок поддерживает любое количество рук.

• Лучи смерти из глаз будут легко реализованы с помощью системы частиц.

• Зрение сквозь стены. На PC мы сделаем это легко, на XBox – если не будет страдать производительность. На PS2 этого эффекта мы не сможем достичь из-за особенностей графического процессора. Не предложить ли дизайнерам отказаться от этой фичи?

• Перемещение по большому миру – понадобиться много времени и сил, но, пожалуй, мы сможем достичь нужного результата на всех платформах.

КРИ 2005. 3 апреля.

Page 7: Разработка под консоли

Выбор платформАрхитектурная совместимостьПараллельные рассчёты игровых процессов?

Интеллектуальное распределением времени, выделяемого на ту или иную операцию?

Как только у всех пользователей будут процессоры с поддержкой Hyper Threading, и все консоли будут поддерживать архитектуру ala Cell, стоит задуматься о разработке сложных многопоточных движков.

КРИ 2005. 3 апреля.

Page 8: Разработка под консоли

Выбор графического движка

• Движок собственного изготовления

• Некое middle-ware решение.

КРИ 2005. 3 апреля.

Page 9: Разработка под консоли

Выбор графического движкаIn-house solution+ Полный доступ ко всем

исходникам

+ Большая гибкость при добавлении желаемых возможностей

+ Перспективность использования при качественной базовой реализации

- Необходимость глубокого понимания архитектуры и возможностей выбранных платформ

- Необходимость наличия высококвалифицированных разработчиков, способных разработать качественное решение

КРИ 2005. 3 апреля.

Page 10: Разработка под консоли

Выбор графического движкаMiddleware+ Набор готовых решений

для ряда платформ

+ Наличие квалифицированной технической поддержки

+ Наличие развитого инструментария

- «Чёрный ящик» отсутствие доступа к исходникам (или наличие, но за отдельные деньги)

- Технологическая привязка к чужому решению

- Возможное отсутствие необходимых features

КРИ 2005. 3 апреля.

Page 11: Разработка под консоли

Эффективное распределение памяти

КРИ 2005. 3 апреля.

Page 12: Разработка под консоли

Эффективное распределение памяти

Стандартная схема

• Единый пул

• Стратегия распределение «first-fit»

Ведёт к фрагментации памяти

Затрудняет поиск утечек

КРИ 2005. 3 апреля.

Page 13: Разработка под консоли

Эффективное распределение памяти

Причины фрагментации:• Распределение объектов с разным временем

жизни в едином пространстве• Распределение объектов существенно

отличающихся размеров в едином пространстве

Свободно

СвободноБлок 1

Блок 1 2

Блок 1 2 Блок 3

Свободно 2

Свободно

Свободно

КРИ 2005. 3 апреля.

Page 14: Разработка под консоли

Эффективное распределение памяти

Пути улучшения эффективности распределения памяти

• Группирование объектов по размерам

• Группирование объектов по времени жизни

• Группирование объектов по предназначению

• Дефрагментация памятиКРИ 2005. 3 апреля.

Page 15: Разработка под консоли

Эффективное распределение памяти

Ключ – введение признака использования выделяемого блока (memory hint)

• Время жизни (global, per-location, per-frame и т.п.)

• Предназначение (string buffer, texture buffer и т.п.)

Block #18

Size = 1024

Hint = Global + String

Block #385

Size = 36

Hint = Temp + Object

КРИ 2005. 3 апреля.

Page 16: Разработка под консоли

Эффективное распределение памяти

Оптимизированная схема №1• Маленькие объекты распределяются из пула

А.• Крупные объекты распределяются из пула Б.

Оптимизированная схема №2• Постоянные объекты распределяются из

пула А.• Временные объекты распределяются из пула

Б.КРИ 2005. 3 апреля.

Page 17: Разработка под консоли

Эффективное распределение памяти

Типы пулов:• Chunk Allocator – все блоки одного размера,

не требуется вспомогательной информации, максимальная скорость распределения.

- используемые части блоков

- неиспользуемые части блоков

- свободные блоки

КРИ 2005. 3 апреля.

Page 18: Разработка под консоли

Эффективное распределение памяти

Типы пулов:• Block Allocator – блоки переменного размера,

классический метод «boundary tags» - к каждому блоку прикреплён тег с дополнительной информацией, стратегия «best-fit»

tag data tag data tag tag data tag

- эффективная (используемая) часть блока

- информационная часть блока (тэг)

- свободные пространство

КРИ 2005. 3 апреля.

Page 19: Разработка под консоли

Эффективное распределение памяти

Практическая схема:• Набор пулов для статических строковых

идентификаторов (chunk, 128 Kb)• Набор пулов для строк (chunk + block, 128 Kb)• Набор пулов для мелких объектов (<128 байт, chunk

512 Kb)• Набор пулов для средних объектов (<4 Kb, block

64Kb)• Набор пулов для объектов графического движка

(chunk 128Kb + block 1Mb)• Набор пулов для объектов времени жизни игровой

локации (chunk 256Kb + block 64Kb)КРИ 2005. 3 апреля.

Page 20: Разработка под консоли

Эффективное распределение памяти

Строки.

• Статические строки != динамические строки. Для хранения используются различные области памяти.

• Счётчики ссылок – копирование строки = присваивание указателя + увеличение счётчика ссылок.

КРИ 2005. 3 апреля.

Page 21: Разработка под консоли

Эффективное распределение памяти

Контейнеры.

• STL. Собственные аллокаторы.

• Вектор с заданной скоростью роста

0

0 1 2 3 4

0 1 2 3 4 5 6 7

0 1 2 3 4 5 6 7 8

величина роста

КРИ 2005. 3 апреля.

Page 22: Разработка под консоли

Эффективное распределение памятиДефрагментация.

• Собирает используемые блоки в одно место

• Освобождает неиспользуемые пулы

Возможна при:

• Отсутствии указателей на блок в момент вызова

КРИ 2005. 3 апреля.

Page 23: Разработка под консоли

Эффективное распределение памяти

КРИ 2005. 3 апреля.

Page 24: Разработка под консоли

Эффективное распределение памяти

КРИ 2005. 3 апреля.

Page 25: Разработка под консоли

Эффективное распределение памяти

Результаты применения технологии:

• Значительное уменьшение фрагментации до почти полного её отсутствия

• Получение полного контроля над временем жизни блоков памяти

• Лёгкий поиск утечек памяти

КРИ 2005. 3 апреля.

Page 26: Разработка под консоли

Большие миры

КРИ 2005. 3 апреля.

Page 27: Разработка под консоли

Большие миры

Требования:

• Непрерывное (без загрузок) перемещение на большие расстояния

• Наполненность мира объектами в т.ч. Интерактивными

Решение – динамическая подгрузка игрового контента.

КРИ 2005. 3 апреля.

Page 28: Разработка под консоли

Большие миры

Что загружать?

Это решает система видимости.

Когда загружать?

Система видимости + дизайнер

КРИ 2005. 3 апреля.

Page 29: Разработка под консоли

Большие мирыQuad- and oct-trees

КРИ 2005. 3 апреля.

Page 30: Разработка под консоли

Большие миры«Кишка»Набор частей большой локации, для

каждой из которых указаны правила связи с другими частями.

Кусок 1Кусок 2

КРИ 2005. 3 апреля.

Page 31: Разработка под консоли

Большие миры«Кишка»Характеристики:• Протяжённость• Связи• «Критические» области

Характеристики определяются техническими ограничениями – успеет ли загрузиться следующий кусок, пока мы перемещаемся по текущему?

КРИ 2005. 3 апреля.

Page 32: Разработка под консоли

Большие миры«Кишка»

1

2

3

КРИ 2005. 3 апреля.

Page 33: Разработка под консоли

Большие мирыЧтение с диска

Больше, но реже

Чаще, но меньше

Всегда возникает компромисс между частотой и объёмом подкачки с диска

КРИ 2005. 3 апреля.

Page 34: Разработка под консоли

Большие мирыЧтение с дискаПовышение скорости

чтения

• Чтение без поиска

• Перенос наиболее критичных к скорости данных на внешние дорожки диска

КРИ 2005. 3 апреля.

Page 35: Разработка под консоли

Большие мирыЧтение с дискаСпособы использования динамической

загрузки• Загрузка необходимых данных по

запросу• Загрузка данных по запросу +

предзагрузка данных которые могут понадобиться

• Загрузка данных для данного куска локации как единого целого

КРИ 2005. 3 апреля.

Page 36: Разработка под консоли

Большие мирыЧтение с дискаЗагрузка необходимых данных по запросу

Загрузкаобъекта

Нужнагеометрия

Запрос ресурсаHouse012.mesh

Поиск + чтение

Нужнатекстура

Запрос ресурсаBrick.tga

Поиск + чтение

Объектсоздан!

Игровой код

Драйвер диска

КРИ 2005. 3 апреля.

Page 37: Разработка под консоли

Большие мирыЧтение с дискаПредзагрузка данных

Загрузкаобъекта

Нужна геометрия

ЗапросHouse.mesh

Загрузка House.mesh

Загрузка Brick.tga

Загрузка Wall.mesh

единая операция

Загрузкаобъекта

Нужна геометрия

ЗапросWall.mesh

ВозвратWall.meshиз кеша

Поиск + чтение

Игровой код

Драйвер диска

Менеджер

ресурсов

КРИ 2005. 3 апреля.

Page 38: Разработка под консоли

Большие мирыЧтение с дискаЗагрузка данных как единого целого

Загрузкаобъекта

Нужна геометрия

ЗапросHouse.mesh

Загрузкапотока

Поиск + чтение

Возвратhouse.mesh

из кеша

Загрузкаобъекта

Нужна геометрия

ЗапросWall.mesh

ВозвратWall.meshиз кеша

КРИ 2005. 3 апреля.

Page 39: Разработка под консоли

Большие мирыСоздание объектовЕсть:• Загруженная геометрия + текстура• Сериализованные данные для

инициализации

Задача:• Создать и инициализировать все 10k+

объектов находящихся в данном куске локации

КРИ 2005. 3 апреля.

Page 40: Разработка под консоли

Большие мирыСоздание объектовСпособ 1.Немедленное создание объектов как только всё

загружено.

Возможные неприятности:

Ход выполнения Инициализация объектов Ход выполнения

Уведомление о готовности данных

Задержка!

При «тяжёлых» объектах или при их большом количестве неминуемы задержки, что выливается в остановке игры на секунды

КРИ 2005. 3 апреля.

Page 41: Разработка под консоли

Большие мирыСоздание объектовСпособ 2.Создание объектов, распределённое на несколько

кадров

Расчёт кадра

Созданиенесколькихобъектов

Расчёт кадра

Созданиенесколькихобъектов

Расчёт кадра

Созданиенесколькихобъектов

кадр кадр кадр

- Усложнение структуры движка

КРИ 2005. 3 апреля.

Page 42: Разработка под консоли

Большие мирыПрактическое применениеRage Rider:

• Технология «кишка»

• Предзагрузка данных

• Средняя длина куска ~ 0.5 Km

• ~1500 игровых объектов в каждом куске

• ~2.5 Mb данных на каждый кусок уровня

• Расстояние видимости ~ 1.2 Km

КРИ 2005. 3 апреля.

Page 43: Разработка под консоли

Ресурсы и мультиплатформенность

КРИ 2005. 3 апреля.

Page 44: Разработка под консоли

Ресурсы и мультиплатформенностьХранение ресурсов в

платформонезависимом виде

+ Единый набор ресурсов+ Единообразный доступ к

ресурсам

- Низкая производительность – необходимо в процессе исполнения «инстанцировать» ресурсы

- Ограничение характеристиками самой слабой из платформ

Хранение ресурсов в платформозависимом виде

+ Максимальная производительность

+ Наиболее полное использование возможностей платформы

- Множество разных наборов ресурсов для каждой из платформ – большой риск рассинхронизированности

- Различный код доступа к ресурсам для различных платформ

КРИ 2005. 3 апреля.

Page 45: Разработка под консоли

Ресурсы и мультиплатформенностьРешение – синтез платформозависимых и

платформонезависимых наборов.

Данные, к которым требуется единообразный доступ на всех платформах – в общем виде.

Данные, требующие максимальной производительности для их использования, или особой обработки – в формате конкретных платформ.

КРИ 2005. 3 апреля.

Page 46: Разработка под консоли

Ресурсы и мультиплатформенностьОбщий формат хранения:• Геометрия для коллизий• Сериализованные описания объектов• Данные для системы AI (пути, триггеры и т.п.)

Платформозависимый формат:• Графические модели• Текстуры (различное разрешение для разных

платформ)• Звуковые данные

КРИ 2005. 3 апреля.

Page 47: Разработка под консоли

Ресурсы и мультиплатформенностьВозможный способ хранения

Resources

PI(platform independent)

PS2

XBox

Common data

Textures

Models

Textures

Models

Сборщик ресурсов автоматически проверяет обновления в исходных каталогах и вносит изменения в архивы для выбранных платформ.

КРИ 2005. 3 апреля.

Page 48: Разработка под консоли

The last but not the leastМелкие оптимизации

КРИ 2005. 3 апреля.

Page 49: Разработка под консоли

Мелкие оптимизацииExceptions? Errors!Исключения используются только для критических

ошибок и только в debug-варианте – избавляемся от таблиц исключений или от кода разворачивания стека.

#if defined(CORE_USE_EXCEPTIONS)

#define CORE_THROW(a) throw(a)

#define CORE_CATCH(a) catch(a)

#define CORE_CATCH_ALL catch(…)

#else

#define CORE_THROW(a) sayGoodByeAndDie(…)

#define CORE_CATCH(a) if (0)

#define CORE_CATCH_ALL if (0)

#endif

КРИ 2005. 3 апреля.

Page 50: Разработка под консоли

Мелкие оптимизацииDouble TroubleПри математических

вычислениях следует явно использовать функции одинарной точности – компиляторы не знают что вы делаете критичное к скорости выполнения приложение.

sin sinf

fmod fmodf

abs absf

КРИ 2005. 3 апреля.

Page 51: Разработка под консоли

Мелкие оптимизацииСкорость vs размерРезультат оптимизации Optimize for speed

не всегда быстрее, чем Optimize for size.

КРИ 2005. 3 апреля.

Page 52: Разработка под консоли

Мелкие оптимизацииОптимизации – зло?Некоторые компиляторы генерируют

неправильный код при высоких уровнях оптимизации.

• Передача/возврат пустого вектора по значению

• Неправильные значения stl-итераторов

КРИ 2005. 3 апреля.

Page 53: Разработка под консоли

Итоги

Использование специализированных технологий позволяет справиться с некоторыми ограничениями, накладываемыми консолями и, в конечном счёте, позволяет разрабатывать качественные игровые движки.

КРИ 2005. 3 апреля.

Page 54: Разработка под консоли

Спасибо!

Вопросы?

[email protected]

www.akella.com

КРИ 2005. 3 апреля.