Стриминг и эффективное чтение с DVD

Страница 1 из 4

Роман Лут
В настоящее время работает ведущим программистом в компании Deep Shadows над проектами Xenus 2: White Gold, Precursors. Участвовал в проектах Xenus: Boiling Point, Venom: Codename Outbreak.

В настоящее время скорость центрального процессора, мощность видеокарты и размер HDD растут намного быстрее, чем объем оперативной памяти. Современные игровые уровни имеют огромную детализацию, но относительно малый объем памяти не позволяет загрузить весь мир целиком. В простейшем случае игра вынуждена прерывать геймплей экранами загрузки. Это очень плохо, особенно для ролевых игр, так как мешает игроку погрузиться в виртуальный мир, портит удовольствие от игры.


Рисунок 1. Загрузка

Для избавления от экранов загрузки применяется стриминг — загрузка ресурсов на фоне. Статья рассматривает преимущества и проблемы этой технологии, стратегии загрузки, реализацию в современных «движках», а также вопросы эффективного стриминга с DVD. Несмотря на широкое использование стриминга в современных играх, в Интернете практически отсутствует информация по этой теме, что и побудило меня к написанию этой статьи. Я постараюсь если не раскрыть, то хотя бы пролить свет на существующие проблемы и их решения на основе собственного опыта реализации этой технологии.

Что такое стриминг?

Стриминг — это загрузка ресурсов с диска в оперативную память на фоне. Для игрока этот процесс полностью прозрачен (в идеале), он продолжает играть, не прерываясь.

Стриминг позволяет реализовывать большие детализированные игровые миры, все ресурсы которых не помещаются в оперативную память. В памяти находится только «активный» контент. При путешествии по миру ненужный контент выгружается, а на его место загружаются данные, которые скоро понадобятся.


Рисунок 2. Мир «Xenus 2: Белое золото»

Любой человек, который когда-либо играл в компьютерные игры, знает, как раздражают экраны загрузки («на самом интересном месте»). Хотя PC-игроки, в принципе, уже с ними смирились и считают их «неизбежным злом», неискушенные владельцы игровых консолей хотят вставить диск в DVD-привод и играть без перерыва. Многие консольные игры, использующие cтриминг, не только не имеют экранов загрузки, но и сокращают время начального запуска, загружая контент во время показа вступительных роликов или показа меню.

Конечно, разработчикам хотелось бы иметь неограниченное количество оперативной памяти и быстрое устройство хранения, но игровые консоли такие, как они есть: относительно малый объем памяти, медленный DVD/Blu-ray. Именно с этими техническими ограничениями и призван бороться стриминг.

Ресурсы

Многие виды ресурсов занимают приемлемый объем памяти, и поэтому игры загружают их при старте и хранят в памяти все время. Это могут быть строки пользовательского интерфейса, скрипты, описание игровых объектов, описание материалов, шейдеры, списки текстур и другие мелочи, ради экономии памяти на которых не имеет смысла усложнять «движок».


Рисунок 3. Ресурсы «Xenus 2: Белое золото»

Обычно самый большой объем памяти занимают текстуры, поэтому они и возглавляют список подгружаемых ресурсов (часто они его и завершают ).

Игра также может подгружать звуки, музыку, модели, уровни, анимация, collision mesh, скрипты, видео и т.д. В своей практике я никогда не встречал стриминг кода, хотя и это возможно.

Что включает в себя поддержка стриминга

Итак, после прочтения вступления вы преисполнились уверенностью, что вам обязательно нужно добавить поддержку стриминга в свою игру. Давайте посмотрим, что нам понадобится для этого:

  • возможность загружать ресурсы на фоне;
  • ориентация «движка» на асинхронную работу с ресурсами;
  • стратегия предварительной загрузки;
  • стратегия выгрузки ресурсов при недостатке памяти.

Первое и основное — это механизм загрузки ресурсов на фоне. Один из вариантов его реализаций будет рассмотрен ниже. Поскольку в конкретный момент времени какого-нибудь ресурса может не быть в памяти, игра должна это понимать: она должна запрашивать фоновую загрузку ресурса и приступать к его использованию только тогда, когда ресурс полностью загрузился.

Если невозможно применять алгоритм с ожиданием загрузки, то игра должна сделать так, чтобы к моменту использования ресурс обязательно был в памяти (стратегия предварительной загрузки). Например, при приближении игрока к некоторой зоне абсолютно все ресурсы зоны загружаются в память.

Если игра стримит разные виды ресурсов, придется придумать, как выгружать их из памяти (стратегия выгрузки). Например, нам понадобилась текстура. Что лучше выгрузить? Другую текстуру, которая давно не использовалась, старый звук или старую модель?

Классический (линейный) стриминг

Простейший вид стриминга можно показать на примере гоночного симулятора. Трасса разделена на участки примерно 200 метров. Дальность отображения — 150 метров. Игра должна держать в памяти максимум две зоны, так как игрок может находиться на стыке зон. Следующая по дороге зона загружается на фоне. Зона, находящаяся позади, выгружается, когда новая зона подключается к игре.


Рисунок 4. Трасса гоночного симулятора — идеальный «мир» для линейного стриминга

Благодаря линейности движения игрока, точно известен порядок загрузки зон. В RPG, где игрок может идти куда угодно, ситуация усложняется, но по-прежнему используется тот же принцип.

Весь мир разделяется на зоны компактной формы, часто — квадратной. Например, на рисунке изображена политическая карта региона, но она отлично иллюстрирует, каким может быть разделение.


Рисунок 5. Политическая карта. Примерно так можно разделять открытый игровой мир на зоны

В данный момент в памяти находятся зоны, которые находятся внутри окружности, радиус которой равен примерно 150% дальности видимости; в ином случае зона выгружается. Фоновая загрузка новой зоны начинается, когда зона входит в окружность, радиус которой равен примерно 140% радиуса видимости. Величина радиуса окружности определяется скоростью загрузки зон и скоростью движения игрока. Цель такой схемы — сделать так, чтобы в памяти всегда были зоны, которые видны игроку. Поскольку направление движения игрока ничем не ограничено, могут возникать ситуации, когда на момент окончания загрузки зона оказывается не нужна, поскольку игрок прошел мимо или пошел в обратную сторону.

В качестве примера можно привести такие игры: GTA 3 (зонами являются архитектурные элементы: дома, участки дорог, мосты, фонари, столбы, автобусные остановки и т.д.), Oblivion (квадраты), Gothic (квадраты), Operation «Flashpoint» (квадраты 1x1 км), Xenus (квадраты 200x200 м).

 
  стр. 1 из 4  
+2

Copyright © 1999–2010 ООО "ДТФ". Все права защищены.

Воспроизведение материалов или их частей в любом виде и форме без письменного согласия запрещено.

Замечания и предложения отправляйте по адресу team@dtf.ru