280 likes | 451 Views
Стриминг и эффективное чтение с DVD диска. Роман Лут, ведущий программист Deep Shadows. Что такое стриминг?. - загрузка ресурсов на фоне к тому моменту, когда они понадобятся. Зачем нужен стриминг?.
E N D
Стриминг и эффективное чтение с DVD диска Роман Лут, ведущий программист Deep Shadows
Что такое стриминг? - загрузка ресурсов на фоне к тому моменту, когда они понадобятся
Зачем нужен стриминг? • большие детализированные игровые миры, все ресурсы которых не помещаются в оперативную память - в памяти находится только «активный» контент • непрерывный геймплей – отсутствие экранов загрузки • сокращение времени начальной загрузки (New game) • преодоление технических ограничений консолей • - преодоление проблем медленных устройств хранения (DVD, сетевое соединение)
Что можно стримить? - текстуры - звуки, музыка - модели - уровни - анимация - collision mesh - видео - и т.д.
Что включает в себя поддержка стриминга? • возможность загружать ресурсы на фоне • ориентацию «движка» на асинхронную работу с ресурсами • стратегию предварительной загрузки • - стратегию выгрузки ресурсов при недостатке памяти
Классический (линейный) стриминг - гоночный симулятор Текущая зона Следующая зона DVD
Огромный мир – игрок может идти в любую сторону • разделение на зоны • в данный момент впамяти находится«активная» зона и ееближайшие соседи • Пример: GTAIII, Oblivion, • Gothic, Operation “Flashpoint”
Уникальные и shared ресусы • Стратегия 1. Все ресурсы одной зоны – уникальны. • приводит к дублированию одинаковых ресурсовв памяти и на DVD • увеличивается размер зоны в памяти • увеличивается размер игры на диске • увеличивается объем данных зоны • + более эффективное чтение с DVD Данные зоны 1 Текстура А Текстура Б Текстура В Данные зоны 2 Текстура А Текстура Г Текстура Д
Уникальные и shared ресурсы Стратегия 2. Некоторые типы ресурсов – общие (shared). Shared ресурсы загружаются при загрузке следующей зоны (если еще не загружены). Зона увеличивает refCountресурса. Текстура А Данные зоны 1 Текстура Б Текстура В Текстура Г Данные зоны 2 Текстура Д • + позволяет сэкономить память • + уменьшается объем загружаемых данных зоны • приводит к фрагментации памяти • недетерминированный порядок чтения (много DVD Seek)
Уникальные и shared ресурсы Стратегия 3. Некоторые ресурсы – общие (shared).Независимый кеш. Shared ресурсы загружаются по надобности. Кэш текстур Текстура А Данные зоны 1 Текстура Б Текстура В Текстура Г Данные зоны 2 Текстура Д + позволяет больше сэкономить память + больше уменьшается объем загружаемых данных зоны дальше
Уникальные и shared ресурсы • Стратегия 3 (продолжение) • приводит к фрагментации памяти • недетерминированный порядок чтения (много DVD Seek) • сложная логика взаимодействия кешей: Для загрузки зоны 2 недостаточно памяти. Какой из кешей должен освободить память? Кеш ресурсов А Кеш ресурсов Б Кеш ресурсов В - невозможно сформировать четкие требования к объему арта Данные зоны 1
КлассStreamableresource • состояние: не загружен, загружен, загружается в данный момент • - метод StartBackgroundLoad() • - метод Unload() • - поле: приоритет • ---------------------------- для общих ресурсов ---------------------- • поле refCount • ----------------- для общих независимых ресурсов --------------- • поле: lastUsedOnFrame - «последний раз использовался на кадре»
Эффективное чтение на фоне • hardware thread для чтения данных(99% времени блокирован I/O операцией) • hardware thread для распаковки, создания и инициализации ресурсов) • - финализация ресурсов в основном thread между кадрами кадр N кадр N+1 Loading thread Init thread Main thread
Стратегии предварительной загрузки ресурсов зоны • - при приближении к зоне – по расстоянию • - по видимости • по тригерам, установленным дизайнерами вручную • Для независимых кешей: • - на основе статистики • - различные эвристики
Пока ресурс не загрузился • используется 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 Ray 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 Media http://www.gamasutra.com/features/gdcarchive/2003/Denman_Stu.ppt Streaming for Next Generation Games http://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-Ray http://www.gamesetwatch.com/2007/01/ps3_oblivion_seeing_double_to.php Blog debate: PS3 to load games slower than the Xbox 360 http://www.joystiq.com/2006/09/04/ps3-to-load-games-slower-than-the-xbox-360/2