Почему игры перезагружают весь уровень при перезапуске уровня?

47

Действительно ли данные так сильно изменяются во время игры?

Я предполагаю, что длинная пауза между перезапуском уровня - это перезагрузка всего уровня. Но мне кажется, что хорошо реализованная система должна просто «пинговать» обратно к началу уровня.

Это более заметно на консолях, но это не заметно в играх для ПК.

меш
источник
8
Ответ на этот вопрос во многом зависит от игры, от разработчиков, их привычек и опыта, а также от многих других факторов. Единственный правильный ответ на общем уровне будет: иногда модифицирован много, иногда нет, иногда вещей потоковые в и , таким образом , начале не в памяти больше, а иногда игры уже делать «пинг» назад к началу уровня, и игры, у которых иногда нет веских причин, почему они не могут этого сделать, а иногда просто потому, что они не реализованы достаточно хорошо.
Кристиан
4
Вообще говоря, гораздо проще перезагрузить уровень (который переводит все в исходное состояние), чем отменить все, что сделал игрок. Так или иначе, по моему опыту.
Бенджамин Дэнджер Джонсон
Вопрос не черно-белый. Сколько состояния перезагружается? Множество игр перезагружают целые наборы текстур без веской причины. Конечно, переходя от уровня 5 до 6 -го уровня может означать загрузки новых текстур, но это не значит , что вы должны делать это каждый раз , когда вы (повторно) начальный уровень 6.
MSalters
@MSalters В основном речь идет о состоянии игры, а не о ресурсах, вам может не понадобиться перезагружать текстуру обычного использования, но больше врага, которого вы уже убили - объект для него нужно уничтожить и перезагрузить в исходном состоянии (даже если его текстура все еще хорошо сохранена в памяти.)
Том 'Синий' Пиддок
Я думаю, что кто-то играл в Wing Commander III по устаревшей системе.
Эрик Реппен

Ответы:

54

Ну, а теперь - что за простой, но интересный вопрос.

При перезагрузке уровня необходимо учитывать множество факторов, поэтому ответ может быть разным.

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

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

Если бы вам пришлось перематывать уровень вместо того, чтобы разрушать и перезагружать его, вам пришлось бы отслеживать каждое измененное состояние. Если вы выпустите ракету из дыры в стене, то вы будете генерировать выступы ландшафта из кусков, падающих со стены, модель стены изменится, чтобы создать дыру, и у вас будут эффекты частиц, которые были созданы, чтобы она выглядела симпатично , Чтобы очистить его, перемотав его обратно в состояние «перезапуска», вам необходимо:

  • Удалите все динамически генерируемые гибы для этой стены (но не удаляйте те из состояния, которое вы загрузили)
  • Удалить эффект частиц для пыли из пулевого отверстия
  • Замените / отремонтируйте стену, чтобы избавиться от дыр, которые вы создали
  • Сбросить боеприпасы к игроку
  • И т.д...

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

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

Так что для больших уровней контента - загрузка одного состояния вместо расчета и «перемотки» одного:

  • Менее интенсивно использует процессор
  • Более эффективен на машинах нижнего уровня
  • Позволяет использовать скрипт миссии и файл сохранения таким же образом (возможно, использовать ту же систему загрузки для загрузки состояния сохранения или состояния контрольной точки миссии при перезапуске уровня)
  • Это означает, что у вас как разработчика меньше работы по сбросу уровня - гораздо проще запрограммировать полную перезагрузку из данных сеанса, чем отслеживать и перематывать. Это, наверное, самый влиятельный момент

Однако, в качестве контрпримеру, файтингу (отличным примером из реальной жизни, являющимся Street Fighter 4), возможно, не нужно перезагружать все это множество активов, чтобы перезапустить уровень. 2 игрока, состояние среды для уровня и простые таймеры уровня в основном статичны и не динамичны (здоровье игроков всегда возрождается со скоростью 100% каждый раунд, таймеры сбрасываются на 90 секунд, а уровень не имеет дыр от пуль [или делает это!] ) и поэтому сброс уровня - это вопрос восстановления здоровья бойцов и возвращения окружающей среды в исходное положение (как наблюдатели на некоторых уровнях).

Так что для файтинга при проведении реванша (не переходя от раунда к раунду) вам необходимо:

  • Сбросить здоровье и энергию до макс или по умолчанию (всегда одинаковые для каждого персонажа)
  • Сброс таймера
  • Сбросить стартовые позиции персонажа
  • Сбросить Terrain в состояние по умолчанию (без пулевых отверстий для исправления или перезагрузки!)

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

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

Я надеюсь, что это пролило некоторый свет на ваш вопрос.

Том Блю Пиддок
источник
7
Отличный ответ ... циничная сторона меня поставила бы ваше: "меньше работы для точки разработчиков выше в списке ... но, возможно, это реализация движка, которая могла бы быть лучше.
Mesh
3
Кроме того, как насчет устранения ошибок? NPC не двигается из-за ошибки в физической системе, утечки памяти и т. Д. Даже если игра тщательно протестирована, такие вещи все же случаются, и должен быть способ вернуть игру в известное и рабочее состояние.
Sulthan
9
Меньше работы - это завидная цель, а не предмет позора. Вы могли бы потратить неделю на создание системы перемотки и месяц, чтобы устранить все ошибки, или перезагрузить и перейти к другим функциям =)
Патрик Хьюз
1
Я думаю, что стоимость является наиболее важным аргументом здесь. Если перезагрузка уровня не случается много и не становится большим раздражением для пользователя, нет никакого стимула для написания оптимизированного кода для ускорения перезагрузки. Просто стоит меньше использовать код для нормальной загрузки.
orlp
1
+1 Я просто хочу уточнить, что перезагрузка уровня и загрузка уровня - если перезагрузка выбрасывает все и начинается с новой загрузки - не требует написания нового кода для достижения цели игрового процесса. Система перемотки - это совершенно новый набор кода, который является нетривиальным, и, поскольку он зависит от состояния переменной, его чрезвычайно сложно отлаживать. Пример: «Исправление ошибки: перезапуск уровня после падения шлема на бомбу после взрыва ракеты в пределах 200 пикселей от воды больше не вызывает сбой рабочего стола». Короче говоря, у вас должна быть ДЕЙСТВИТЕЛЬНО веская причина для беспокойства.
BrianH
14

Чтобы прояснить существующие ответы на ваш вопрос о консолях: у них недостаточно памяти для хранения как начального, так и текущего состояния для более сложных сложных игр.

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

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

В идеале, игрок тратит больше времени на игру, чем на смерть и перезапуск, так что оптимизация для лучшего опыта во время игры имеет больше смысла.

Вещи могут резко измениться с консолями следующего поколения и их 8 ГБ памяти. Или они могут остаться прежними, просто с моделями и материалами с более высоким разрешением и большим количеством активных игровых объектов. Время покажет. Учитывая, что игры для ПК обычно предназначены для компьютеров с 2 ГБ ОЗУ и 512 МБ видеопамяти (хотя многие из них масштабируются до гораздо больших значений), 8 ГБ новых консолей довольно роскошны с точки зрения минимальных базовых показателей. В ближайшие годы мы, вероятно, увидим переход к играм, требующим 64-разрядного процессора / ОС и 4-8 ГБ оперативной памяти с 1-2 ГБ видеопамяти. Хранение нескольких состояний в памяти для быстрого создания снимков должно быть намного проще.

Шон Миддледич
источник
+1 Фантастическая информация и отличное объяснение того, почему при перезагрузке консоли заметно медленнее.
Том Блю Пиддок
7

Я не согласен с большей частью ответа Блю, я не верю, что есть техническая причина не сбрасывать уровни - я, конечно, никогда не сталкивался с таким. Уровень загрузки почти всегда медленнее, чем сброс уровня, на самом деле мне трудно представить себе случай, когда этого не произойдет. В большинстве случаев игры могут предлагать мгновенную загрузку уровней, если разработчики захотят.

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

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

Джек Эйдли
источник
3
Возможно, вы захотите проверить ответ Шона для примера технического случая, когда вы можете перезагрузить уровень, а не «сбрасывать» его
SpartanDonut
2

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

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

Вспоминается Dungeon Siege (когда-то разработчики утверждали, что для управления памятью потребовалось больше вычислительной мощности, чем для реального игрового процесса), большинство MMORPGS делают это, шутеры с открытой средой должны это делать, ... В этих случаях начало уровень (или даже точка возрождения 30 секунд назад) больше не может быть (полностью) в памяти.

Часто новая перезагрузка - это самый простой, дешевый и, пожалуй, самый быстрый способ.

Редактировать: Вот статья о загрузочных механизмах Dungeon Siege: Непрерывный мир Dungeon Siege

ЛВУ
источник
Хорошая мысль, я не думал о непрерывных или плавных уровнях. Это потребовало бы совершенно другой системы загрузки уровней.
Том Блю Пиддок
2

С отличными ответами Шона и Блю относительно ограничений физической платформы и про-довольных решений я собираюсь расширить комментарий на другой подход:

Почему вы должны, вероятно, просто полностью перезагрузить уровень

Итак, ваш вызов loadLevel () работает отлично, ура! Вы транслируете информацию в файл уровня и шаг за шагом строите мир на его основе, создавая объекты и загружая текстуры и звуки по мере продвижения. Затем, когда все будет сделано - или сделано «достаточно», чтобы начать воспроизведение, вы вызываете startPlay (), и ваш мир раскрывается, и ваша музыка начинает играть.

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

Теперь, что происходит, когда вы хотите добавить функцию «Уровень перезапуска»? Что ж...

unloadLevel(currentLevel);
loadLevel(currentLevel);
startPlay();

И вы сделали! Никакого нового кода, всего лишь несколько простых вызовов функций, и вы уже написали и отладили все это, так что теперь ваша новая блестящая функция перезапуска вычеркнута из вашего списка и, вероятно, никогда больше не встретится - беспроблемный, не ржавеющий код это лучший вид! Переместите код в функцию restartCurrentLevel (), и вы можете сложить этот код и больше никогда не смотреть на него - возможно, после того, как убедитесь, что есть уровень для перезапуска, конечно :)

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

Ах, но теперь ваши уровни растут, и ваши текстуры становятся более подробными, а саундтрек был разорван на 512 кбит / с с отдельными каналами для каждого голоса и музыкального слоя (в то время это казалось хорошей идеей, хотя вы не можете вспомнить почему. ...) и кое-что о «зависящих от состояния источника многомерных матрицах преобразования Фурье с отслеживанием воксельных лучей», которые, как вы думаете, просто полностью составлены, а не реальны, и загрузка уровней на самом деле занимает некоторое время, и ее начало раздражать вас. Вы даже тестировали на реальных людях, и они на самом деле испытывают отвращение ко времени ожидания, так как оно хуже, чем в аналогичных играх (вы не ожидаете, что столица MMORPG с 100 игроками полностью загрузится за <2 секунды, не так ли?), и это проблема.

Так как вы оптимизируете? Что ж, если повторная загрузка уровней является проблемой, то не является ли загрузка уровней проблемой? Если вы думаете, что это просто перезарядка, то почему люди перегружают ваш уровень гораздо чаще, чем просто загружают уровень в первую очередь? Похоже, проблема игрового процесса, а не проблема разработки кода. Кто думает, что забавно перезагружать уровень снова и снова, и просто хочет, чтобы он был быстрее, чем его можно было избежать ?

Сначала исправьте настоящую проблему!

Но допустим, что ваша игра разработана таким образом, что вы должны хотя бы время от времени перезагружать ее, а время загрузки достаточно велико, чтобы его можно было выполнить один раз, и это совершенно неизбежно, но вам не нужно делать это снова. Что это за игра? Кажется, что это немного странная проблема ... может быть, игра с высоким разрешением, похожая на Portal, в которой предполагается, что вы собираетесь много раз испортить головоломку?

Прежде всего, вы должны понимать, что это не будет тривиальным. Вам придется писать совершенно новый, непроверенный код, и он «зависит от состояния», так что вы можете даже не знать, что будет или не будет использоваться повторно между уровнями. Есть ли на вашем уровне случайные элементы, спавны, переменные текстуры (ваши скелеты лишь иногда носят доспехи?) Или другие изменяющиеся элементы? Есть ли что-то, что меняется у игрока, например, наряд или индивидуальная модель или цвета / двери / ловушки?

Вы будете делать сравнения, и многие из них. Вы будете проходить по элементам уровня, сравнивая то, что будет необходимо, с тем, что загружено прямо сейчас (что вы делаете с вещами, которые были загружены для последнего уровня, но не для этого - отпустите их или удерживайте, чтобы предотвратить будущее) загрузить?). Если это действительно имеет большое значение для вашей игры, вы, вероятно, захотите изменить свой код загрузки / выгрузки, чтобы увидеть, загружено ли что-то уже перед загрузкой (что делает код многоцелевым, но потенциально вносит новые ошибки в ранее работающие функции и функции). которые тщательно высвобождают ресурсы, которые не будут использоваться в ближайшем будущем). Вздох.

Независимо от того, что вы делаете, даже если ваша игра проста, вы будете сталкиваться с неясными ошибками, которые основаны на уровне уровня / игрока, когда уровень был перезапущен, что не происходит, когда вы загружаете уровень в первый раз. Таким образом, вы можете писать обновления игры с текстом вроде:

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

Реальная причина большинства игр не беспокоить

Вы когда-нибудь замечали, что большинство людей просто красят или укладывают гипсокартон поверх своих существующих стен вместо того, чтобы разделывать их до базового слоя, или укладывают ковер прямо на паркетные полы вместо того, чтобы натягивать их?

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

То же самое относится и к программному обеспечению, от игр до мультимедиа презентаций Power Point - если все, что вы делаете, это сбрасываете несколько секунд с экрана загрузки, на который люди тратят 1% своего времени, то это лучше сделать невероятно тривиально, или вы получаете очень плохая отдача от вложенного времени.

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

BrianH
источник
0

Потому что сложнее выработать противоположное поведение, которое заключается в хранении статических игровых данных (таких как текстуры, геологическая информация, незатронутые мобы) в памяти и перезагрузке только динамических данных (таких как позиция игрока, статистика игрока, статус квеста, инвентарь) ,

Так как это стоит больше денег и времени, разработчики игр обычно этого не делают.

XTRO
источник
Это не распространяется на ситуации, когда должно происходить обратное из-за жанра игры или индивидуальных требований. Например, Принц Персии, которому необходимо записать игровое состояние, чтобы использовать определенную игровую механику, и примеры файтингов, которые я привел, должны быть в состоянии перезагрузить отдельные состояния предмета / уровня / персонажа, чтобы сбросить их до половины игры, чтобы начать следующий раунд или перезапустите матч, чтобы начать следующую игру. Они необходимы для того, чтобы соответствовать требованиям игры, поэтому разработчикам игр необходимо тратить больше времени и денег.
Том Блю Пиддок
Если в конкретной игре происходит обратное, приведенный выше вопрос недействителен для этой игры. Потому что время загрузки в игре, в которой происходит обратное, будет коротким. Я только что ответил на вопрос о ситуации, к которой это относится (к играм, которые загружают весь уровень с нуля)
Xtro
Если происходит противоположное в том случае, когда могла возникнуть предпосылка вопроса, всегда стоит отметить это и почему. Пропуск информации или упущение подробностей о том, почему возникла ситуация или решение, никогда не принесет пользы. Сказать, что нет необходимости в деталях, немного противоречит интуиции, поскольку в первую очередь не возникло бы вопроса, если бы человек не искал детали. Если вы в состоянии предоставить больше деталей, всегда стремитесь сделать это, так как это помогает другим узнать больше о предмете в целом и получить то, что нужно от него.
Том Блю Пиддок
Итак, ваша реакция на мою первую строку ответа, которая о "не нужны подробности", верно? если я уберу эту строку, вы бы вернули -1 очко назад?
Xtro
Как ни странно - да. Никогда не препятствуйте деталям, где это возможно, и вы, как правило, обнаружите, что ваши ответы получают гораздо большую оценку.
Том Блю Пиддок