Стриминг и эффективное чтение с dvd диска
DESCRIPTION
Стриминг и эффективное чтение с DVD диска. Роман Лут, ведущий программист Deep Shadows. Что такое стриминг?. - загрузка ресурсов на фоне к тому моменту, когда они понадобятся. Зачем нужен стриминг?. - PowerPoint PPT PresentationTRANSCRIPT
Зачем нужен стриминг?- большие детализированные игровые миры, все ресурсы которых не помещаются в оперативную память - в памяти находится только «активный» контент
- непрерывный геймплей – отсутствие экранов загрузки
- сокращение времени начальной загрузки (New game)
- преодоление технических ограничений консолей
- преодоление проблем медленных устройств хранения (DVD, сетевое соединение)
Что можно стримить?- текстуры- звуки, музыка- модели- уровни- анимация- collision mesh- видео- и т.д.
Что включает в себя поддержка стриминга?
- возможность загружать ресурсы на фоне
- ориентацию «движка» на асинхронную работу с ресурсами
- стратегию предварительной загрузки
- стратегию выгрузки ресурсов при недостатке памяти
Огромный мир – игрок может идти в любую сторону-разделение на зоны
- в данный момент впамяти находится«активная» зона и ееближайшие соседи
Пример: GTAIII, Oblivion,Gothic, Operation “Flashpoint”
Уникальные и shared ресусыСтратегия 1. Все ресурсы одной зоны – уникальны.- приводит к дублированию одинаковых ресурсов в памяти и на DVD- увеличивается размер зоны в памяти- увеличивается размер игры на диске- увеличивается объем данных зоны+ более эффективное чтение с DVD
Данные зоны 1 Текстура А Текстура Б Текстура В
Данные зоны 2 Текстура А Текстура Г Текстура Д
Уникальные и shared ресурсыСтратегия 2. Некоторые типы ресурсов – общие (shared). Shared ресурсы загружаются при загрузке следующей зоны (если еще не загружены). Зона увеличивает refCount ресурса.
+ позволяет сэкономить память+ уменьшается объем загружаемых данных зоны- приводит к фрагментации памяти- недетерминированный порядок чтения (много DVD Seek)
Данные зоны 1Текстура А
Текстура Б
Текстура В
Данные зоны 2 Текстура Г
Текстура Д
Уникальные и shared ресурсыСтратегия 3. Некоторые ресурсы – общие (shared). Независимый кеш. Shared ресурсы загружаются по надобности.
+ позволяет больше сэкономить память+ больше уменьшается объем загружаемых данных зоны
дальше
Данные зоны 1Текстура А
Текстура Б
Текстура В
Данные зоны 2 Текстура Г
Текстура Д
Кэш текстур
Уникальные и shared ресурсыСтратегия 3 (продолжение)- приводит к фрагментации памяти- недетерминированный порядок чтения (много DVD Seek)
- сложная логика взаимодействия кешей:
Данные зоны 1
Кеш ресурсов А
Кеш ресурсов Б
Кеш ресурсов В
Для загрузки зоны 2 недостаточно памяти. Какой из кешей должен освободить память?
- невозможно сформировать четкие требования к объему арта
Класс Streamable resource- состояние: не загружен, загружен, загружается в данный момент- метод StartBackgroundLoad()- метод Unload()- поле: приоритет---------------------------- для общих ресурсов ----------------------- поле refCount----------------- для общих независимых ресурсов ---------------- поле: lastUsedOnFrame - «последний раз использовался на кадре»
Эффективное чтение на фоне- hardware thread для чтения данных(99% времени блокирован I/O операцией)- hardware thread для распаковки, создания и инициализации ресурсов)- финализация ресурсов в основном thread между кадрами
Loading thread
Init thread
Main thread
кадр N кадр N+1
Стратегии предварительной загрузки ресурсов зоны- при приближении к зоне – по расстоянию- по видимости- по тригерам, установленным дизайнерами вручную
Для независимых кешей:- на основе статистики- различные эвристики
Пока ресурс не загрузился-используется dummy-ресурс (например, уменьшенная версия текстуры)- dummy-ресурс должен быть в памяти всегда
- или объект просто не отображается
- для некоторых типов ресурсов невожножно создать dummy-ресурс: звуки, collision mesh. Эти ресурсы должны быть в памяти всегда
- возможное решение: хранить в памяти упакованную версию такого ресурса, распаковывать при необходимости
Dummy-ресурсы- текстура – уменьшенная версия, 32x32 DXT1 = ~700 байт (на самом деле больше из-за layout)- модель – спрайт/нижний LOD/не отображается- звук – моно, низкий битрейт/упакованный/НЕТ- уровень – НЕТ- музыка – не проигрывается- анимация – НЕТ- collision mesh – НЕТ- если ресурс понадобился, а его нет в памяти – возникает провал FPS- если сложно/невозможно реализовать стратегию предварительной загрузки для данного типа ресурса – нельзя использовать загрузку по надобности.
Фрагментация памяти
- актуально для XBOX,PS2,PS3,Nintendo DS, Wii- Windows, XBOX 360 – не актуально (виртуальная память, нет фрагментации физической памяти) Решения:- зона – линейный блок, in-place construction- разделение памяти на зоны для разных типов ресурсов, custom allocators- сборка мусора (возможна только при использовании ref-pointers)
Насколько большой может быть зона?-все «активные» зоны и их общие ресурсы должны помещаться в оперативную память
-если зоны загружаются в слоты, объем зоны лимитируется размером слота
- скорость движения игрока: зоны должны успевать загружаться
Насколько большой может быть зона?- сегмент дороги – 0.5 км- скорость машины – 100км/час
- следующий сегмент уже должен быть в памяти, когда до него 0.1 км
- есть примерно 14,5 сек
- скорость чтения с диска – 6Мб/сек
- размер зоны – 87МБ MAX
Физические характеристики
HDD/DVD/Blue RaySATA HDD PC DVD
12xXBOX 360 DL-
DVD12x CAV
PS3 Blu-Ray2x CLV
Reading speed, Mb/s 30-60Mb/s 8-16Mb/s 8-16Mb/s 9Mb/s
Full stroke seek - 176 170-230ms 350-400ms
1/3 stroke seek(random seek) 7-20ms 115 110-150ms 50-100ms
Layer change - ? 75ms -
Spin Up - 2800 2000ms ???
http://forum.beyond3d.com/showthread.php?t=37751
Загрузка с DVD - пример
- средняя скорость – 12 Mb/s
- seek 120ms = 12*0.12 = 1.44 Mb/s потеряно
- seek+layer change (200ms) = 2.4MB/s потеряно
- Spin up – 2sek = 24Mb/s потеряно
- 3 seek на чтение 0.5 MB: скорость: 7.68Mb/s
Оптимизация чтения с DVD- основная задача при чтении с DVD/Blue Ray – минимизация количества Seek
- компрессия ресурсов
- групповые файлы (DVD сектор – 2Кб)
- кеширование на HDD
Минимизация количества Seek-все ресурсы зоны – один линейный блок(Файлы), дубликаты ресурсов в разных блоках - максимально эффективное чтение
-расположить зависимые файлы близко друг к другу
-«перетасовка» очереди загрузки для минимизации длины Seek
- групповые файлы – не нужно seek на каталог, файлы расположены вплотную
Компрессия- текстуры – DXT/JPEG/ etc.
- звуки – mp3, ogg
- все остальное - ZLIB, LZW etc
Пример.Чтение:12 Mb/s, Распаковка: 30Mb/s, Compression rate: 0.6 Скорость чтения: 14.3Mb/s При параллельной распаковке: 20Mb/s
Xenus 2 . Стратегия загрузкиПри приближении к зоне:- загружается геометрия уровня, collision mesh, свойста объектов По надобности: текстуры, модели, звуки, музыка Эвристики: зависимость ресурсов (автомобить + взорванный автомобиль), модель уружия – модель гильз и т.д. Некоторые ресурсы всегда в памяти (шейдеры, строки, описания объектов, диалоги, текстуры HUD)
Минимизация Seek- групповые файлы (100Mb - 2GB)
- минимизация расстояний между зависимыми файлами:
- группировка файлов по типам(текстуры, модели, уровни)
- генерация графа со связями между файлами (текстура-текстура (в пределах модели), модель-модель(в пределах зоны), модель-модель (зависимые модели), звук-звук (в пределах зоны) и т.д.
- чем сильнее связь, тем ближе должны быть файлы
- oценочная функция: S = E (k*distance(f1,f2))^2
Минимизация оценочной функции- ~5000 узлов в графе
- генетический алгоритм
- вставка дубликатов для оптимизации
- 2-24 часа на один групповой файл
- решение может быть сохранено в отдельный файл, и использовано много раз для построения оптимизированных групповых файлов
Вопросы?Highly Detailed Continuous Worlds: Streaming Game Resources From Slow Mediahttp://www.gamasutra.com/features/gdcarchive/2003/Denman_Stu.ppt
Streaming for Next Generation Gameshttp://www.gamasutra.com/view/feature/1769/streaming_for_next_generation_games.php?print=1
It’s Still Loading?http://www.drizzle.com/~scottb/gdc/its-still-loading.ppt
PS3 Oblivion Seeing Double To Counteract Blu-Rayhttp://www.gamesetwatch.com/2007/01/ps3_oblivion_seeing_double_to.php Blog debate: PS3 to load games slower than the Xbox 360http://www.joystiq.com/2006/09/04/ps3-to-load-games-slower-than-the-xbox-360/2