Действительно ли данные так сильно изменяются во время игры?
Я предполагаю, что длинная пауза между перезапуском уровня - это перезагрузка всего уровня. Но мне кажется, что хорошо реализованная система должна просто «пинговать» обратно к началу уровня.
Это более заметно на консолях, но это не заметно в играх для ПК.
levels
filesystem
меш
источник
источник
Ответы:
Ну, а теперь - что за простой, но интересный вопрос.
При перезагрузке уровня необходимо учитывать множество факторов, поэтому ответ может быть разным.
Если ваше состояние уровня содержит большой список ресурсов, может быть более практичным начать с чистого листа при перезагрузке уровня обратно в состояние сохранения / миссии, поскольку это поддерживает точное состояние уровня после перезагрузки, но не требует много обработки. Однако более эффективно сбросить активы в одиночку, если принять во внимание лишь некоторые из них, - убедиться, что вы можете быстро перезапустить действие на этих меньших уровнях. Последнее особенно важно, когда вам не нужно ничего сохранять на сцене или это не зависит от вашего выбора в игре - если вам не нужно сохранять мертвые тела с первого пробега через деревню, они не будут необходимо перезагружать на обратном пути через этот уровень, тем самым экономя время процессора и экономя время доступа к состоянию миссии.
Хорошим примером для подражания был бы шутер от первого лица, который использовал разрушения местности / маркеры пуль, которые имели постоянное состояние во время этого прохождения, но не остановились бы, если бы вы перезапустили эту контрольную точку или уровень .
Если бы вам пришлось перематывать уровень вместо того, чтобы разрушать и перезагружать его, вам пришлось бы отслеживать каждое измененное состояние. Если вы выпустите ракету из дыры в стене, то вы будете генерировать выступы ландшафта из кусков, падающих со стены, модель стены изменится, чтобы создать дыру, и у вас будут эффекты частиц, которые были созданы, чтобы она выглядела симпатично , Чтобы очистить его, перемотав его обратно в состояние «перезапуска», вам необходимо:
При таком большом количестве ресурсов, необходимых для перемотки уровня, зачастую требуется меньше ресурсов процессора, чтобы просто уничтожить весь уровень и заново загрузить все ресурсы в их состояниях по умолчанию или для конкретных задач. Необходимость сброса определенных объектов включает в себя поиск списка объектов в сцене, а затем доступ к их свойствам для их сброса. Вместо того, чтобы пулевое отверстие в стене ремонтировалось с помощью очистки, вам не нужно рассчитывать какие-либо действия по очистке, просто удалите весь уровень из памяти и перезагрузите его с нуля.
Это означает, что перезагрузка уровня выполняется из одного объекта состояния (файл сохранения игры или сценарий миссии) и не требует динамических вычислений. Для консолей это усугубляется временем загрузки дисков. Это также помогает компьютерным играм, поскольку в них могут учитываться компьютеры, не обладающие вычислительной мощностью, чтобы время загрузки было приемлемым.
Так что для больших уровней контента - загрузка одного состояния вместо расчета и «перемотки» одного:
Однако, в качестве контрпримеру, файтингу (отличным примером из реальной жизни, являющимся Street Fighter 4), возможно, не нужно перезагружать все это множество активов, чтобы перезапустить уровень. 2 игрока, состояние среды для уровня и простые таймеры уровня в основном статичны и не динамичны (здоровье игроков всегда возрождается со скоростью 100% каждый раунд, таймеры сбрасываются на 90 секунд, а уровень не имеет дыр от пуль [или делает это!] ) и поэтому сброс уровня - это вопрос восстановления здоровья бойцов и возвращения окружающей среды в исходное положение (как наблюдатели на некоторых уровнях).
Так что для файтинга при проведении реванша (не переходя от раунда к раунду) вам необходимо:
И это, по сути, весь список - это означает, что более быстрая перезагрузка состояния вместо полной перезагрузки уровня. Это также может быть показано по времени загрузки, когда вы изначально начинаете матч. Загрузка всех моделей персонажей и уровней занимает много времени, но только несколько тактов процессора сбрасывают начальные позиции персонажей между матчами с уже загруженной моделью.
Важно отметить, что это также является более востребованным требованием для файтингов, поскольку их игроки стремятся невероятно быстро вернуться в игру, поскольку матчи обычно могут длиться всего минуту, подчеркивая, что этот ответ очень сильно зависит от игры. и жанр. FPS требуют более динамичных активов, в то время как бойцы требуют быстрых повторяющихся действий.
Я надеюсь, что это пролило некоторый свет на ваш вопрос.
источник
Чтобы прояснить существующие ответы на ваш вопрос о консолях: у них недостаточно памяти для хранения как начального, так и текущего состояния для более сложных сложных игр.
Игра может хранить уровень и начальное состояние отдельно, так что только состояние может быть переиздано, и это очень вероятно, что делают многие игры. Даже потоковая передача будет немного медленнее, чем если бы она сохранялась в памяти.
«Лучшая» консоль текущего поколения имеет всего 512 МБ памяти, совместно используемой данными ЦП и графикой. Это крошечный. Одной из современных проблем разработки консолей является попытка вписаться в игры, которые соответствуют сегодняшним уровням качества с таким небольшим объемом памяти. Подсчет килобайт может стать важным, особенно близко к дате отправки. Хранение копии начального состояния уровня - это некоторый объем данных, без которого можно обойтись, что позволяет использовать больше памяти для вещей, которые делают игру более интересной во время игры, а не просто ускоряют перезагрузку уровней.
В идеале, игрок тратит больше времени на игру, чем на смерть и перезапуск, так что оптимизация для лучшего опыта во время игры имеет больше смысла.
Вещи могут резко измениться с консолями следующего поколения и их 8 ГБ памяти. Или они могут остаться прежними, просто с моделями и материалами с более высоким разрешением и большим количеством активных игровых объектов. Время покажет. Учитывая, что игры для ПК обычно предназначены для компьютеров с 2 ГБ ОЗУ и 512 МБ видеопамяти (хотя многие из них масштабируются до гораздо больших значений), 8 ГБ новых консолей довольно роскошны с точки зрения минимальных базовых показателей. В ближайшие годы мы, вероятно, увидим переход к играм, требующим 64-разрядного процессора / ОС и 4-8 ГБ оперативной памяти с 1-2 ГБ видеопамяти. Хранение нескольких состояний в памяти для быстрого создания снимков должно быть намного проще.
источник
Я не согласен с большей частью ответа Блю, я не верю, что есть техническая причина не сбрасывать уровни - я, конечно, никогда не сталкивался с таким. Уровень загрузки почти всегда медленнее, чем сброс уровня, на самом деле мне трудно представить себе случай, когда этого не произойдет. В большинстве случаев игры могут предлагать мгновенную загрузку уровней, если разработчики захотят.
Реальный ответ, как предполагается, проще и быстрее. Повторная загрузка уровней - это то, что игра требует в любом случае, поэтому перенастроить ее на перезапуск уровня относительно просто. Сброс требует сложных новых путей с большим потенциалом для новых ошибок и утечек памяти, и это требует приличных затрат времени разработчика. В некоторых случаях это может также расширить пределы памяти. Поскольку игры редко разрабатываются с избытком времени разработчика, такие элементы, как восстановление уровня, имеют прискорбную тенденцию к падению, особенно если игровая архитектура не является самой лучшей.
Хотя я предполагаю, что может возникнуть ситуация, когда «перемотка» была необходима для сброса, на самом деле большинству игр нужно только сохранить исходное состояние, обеспечить эффективные средства для полного сброса в это состояние для сохраненных объектов и средства помечать объекты как отказаться от перезагрузки. Информация о состоянии игры также должна храниться и восстанавливаться. Информация такого типа обычно относительно невелика по сравнению с требованиями для всего уровня, поэтому это устраняет необходимость в медленной и дорогой загрузке данных с диска (включая крупные объекты, такие как текстуры и модели) и заменяет ее для быстрой, Прохождение сцены.
источник
Для обеспечения больших уровней или непрерывного игрового процесса, даже с ограниченным объемом памяти (память всегда слишком мала, вопрос заключается в том, если вы сначала достигнете предела в ОЗУ или на видеокарте), существует другая стратегия:
Имейте в памяти только ту часть уровня, которая нужна игроку или понадобится через несколько секунд. Модели, текстуры, образцы звука, ... которые, вероятно, больше не нужны, удаляются из памяти.
Вспоминается Dungeon Siege (когда-то разработчики утверждали, что для управления памятью потребовалось больше вычислительной мощности, чем для реального игрового процесса), большинство MMORPGS делают это, шутеры с открытой средой должны это делать, ... В этих случаях начало уровень (или даже точка возрождения 30 секунд назад) больше не может быть (полностью) в памяти.
Часто новая перезагрузка - это самый простой, дешевый и, пожалуй, самый быстрый способ.
Редактировать: Вот статья о загрузочных механизмах Dungeon Siege: Непрерывный мир Dungeon Siege
источник
С отличными ответами Шона и Блю относительно ограничений физической платформы и про-довольных решений я собираюсь расширить комментарий на другой подход:
Почему вы должны, вероятно, просто полностью перезагрузить уровень
Итак, ваш вызов loadLevel () работает отлично, ура! Вы транслируете информацию в файл уровня и шаг за шагом строите мир на его основе, создавая объекты и загружая текстуры и звуки по мере продвижения. Затем, когда все будет сделано - или сделано «достаточно», чтобы начать воспроизведение, вы вызываете startPlay (), и ваш мир раскрывается, и ваша музыка начинает играть.
Теперь, когда вы закончите с уровнем, или выйдете в меню, или выйдете из игры, вы вызываете unloadLevel (), чтобы освободить все ресурсы и память, которые вы держали, чтобы обеспечить беспроблемный опыт.
Теперь, что происходит, когда вы хотите добавить функцию «Уровень перезапуска»? Что ж...
И вы сделали! Никакого нового кода, всего лишь несколько простых вызовов функций, и вы уже написали и отладили все это, так что теперь ваша новая блестящая функция перезапуска вычеркнута из вашего списка и, вероятно, никогда больше не встретится - беспроблемный, не ржавеющий код это лучший вид! Переместите код в функцию restartCurrentLevel (), и вы можете сложить этот код и больше никогда не смотреть на него - возможно, после того, как убедитесь, что есть уровень для перезапуска, конечно :)
Но потом вы задаетесь вопросом, не является ли это пустой тратой, выгружая вещи, которые вы собираетесь перезагрузить в любом случае. Что ж, если ваши уровни и ресурсы невелики, то самое большее, что вам нужно - это несколько свободных секунд времени загрузки каждый раз, когда «Перезапуск» вызывается даже на медленных системах (и, возможно, на старых смартфонах), так кого это волнует? «Преждевременная оптимизация», у вас есть дела поважнее.
Ах, но теперь ваши уровни растут, и ваши текстуры становятся более подробными, а саундтрек был разорван на 512 кбит / с с отдельными каналами для каждого голоса и музыкального слоя (в то время это казалось хорошей идеей, хотя вы не можете вспомнить почему. ...) и кое-что о «зависящих от состояния источника многомерных матрицах преобразования Фурье с отслеживанием воксельных лучей», которые, как вы думаете, просто полностью составлены, а не реальны, и загрузка уровней на самом деле занимает некоторое время, и ее начало раздражать вас. Вы даже тестировали на реальных людях, и они на самом деле испытывают отвращение ко времени ожидания, так как оно хуже, чем в аналогичных играх (вы не ожидаете, что столица MMORPG с 100 игроками полностью загрузится за <2 секунды, не так ли?), и это проблема.
Так как вы оптимизируете? Что ж, если повторная загрузка уровней является проблемой, то не является ли загрузка уровней проблемой? Если вы думаете, что это просто перезарядка, то почему люди перегружают ваш уровень гораздо чаще, чем просто загружают уровень в первую очередь? Похоже, проблема игрового процесса, а не проблема разработки кода. Кто думает, что забавно перезагружать уровень снова и снова, и просто хочет, чтобы он был быстрее, чем его можно было избежать ?
Сначала исправьте настоящую проблему!
Но допустим, что ваша игра разработана таким образом, что вы должны хотя бы время от времени перезагружать ее, а время загрузки достаточно велико, чтобы его можно было выполнить один раз, и это совершенно неизбежно, но вам не нужно делать это снова. Что это за игра? Кажется, что это немного странная проблема ... может быть, игра с высоким разрешением, похожая на Portal, в которой предполагается, что вы собираетесь много раз испортить головоломку?
Прежде всего, вы должны понимать, что это не будет тривиальным. Вам придется писать совершенно новый, непроверенный код, и он «зависит от состояния», так что вы можете даже не знать, что будет или не будет использоваться повторно между уровнями. Есть ли на вашем уровне случайные элементы, спавны, переменные текстуры (ваши скелеты лишь иногда носят доспехи?) Или другие изменяющиеся элементы? Есть ли что-то, что меняется у игрока, например, наряд или индивидуальная модель или цвета / двери / ловушки?
Вы будете делать сравнения, и многие из них. Вы будете проходить по элементам уровня, сравнивая то, что будет необходимо, с тем, что загружено прямо сейчас (что вы делаете с вещами, которые были загружены для последнего уровня, но не для этого - отпустите их или удерживайте, чтобы предотвратить будущее) загрузить?). Если это действительно имеет большое значение для вашей игры, вы, вероятно, захотите изменить свой код загрузки / выгрузки, чтобы увидеть, загружено ли что-то уже перед загрузкой (что делает код многоцелевым, но потенциально вносит новые ошибки в ранее работающие функции и функции). которые тщательно высвобождают ресурсы, которые не будут использоваться в ближайшем будущем). Вздох.
Независимо от того, что вы делаете, даже если ваша игра проста, вы будете сталкиваться с неясными ошибками, которые основаны на уровне уровня / игрока, когда уровень был перезапущен, что не происходит, когда вы загружаете уровень в первый раз. Таким образом, вы можете писать обновления игры с текстом вроде:
«Сбрасывание шлема с бомбы на плитку, у которой взорвалась ракета, которая также находилась в пределах 200 пикселей от воды, больше не повредит ваши игровые данные и не приведет к сбою игры».
Реальная причина большинства игр не беспокоить
Вы когда-нибудь замечали, что большинство людей просто красят или укладывают гипсокартон поверх своих существующих стен вместо того, чтобы разделывать их до базового слоя, или укладывают ковер прямо на паркетные полы вместо того, чтобы натягивать их?
Простой факт заключается в том, что это все больше работы за минимальное вознаграждение. Окрашивание существующих стен прекрасно работает в большинстве случаев , а ценность вырубки полов из твердой древесины часто минимальна или вообще отсутствует.
То же самое относится и к программному обеспечению, от игр до мультимедиа презентаций Power Point - если все, что вы делаете, это сбрасываете несколько секунд с экрана загрузки, на который люди тратят 1% своего времени, то это лучше сделать невероятно тривиально, или вы получаете очень плохая отдача от вложенного времени.
И поэтому большинство игр не беспокоятся, и мне трудно думать о многих играх, в которых загрузка экранов делала хорошую игру менее полезной, за исключением нескольких крайних примеров; крайние примеры - это когда оптимизация для более быстрой загрузки уровней имеет смысл, и это крошечные фракции игр, которые делают их общедоступными, и, возможно, даже меньшие фракции игр, которые никто никогда не видит, потому что они никогда не выпускаются.
источник
Потому что сложнее выработать противоположное поведение, которое заключается в хранении статических игровых данных (таких как текстуры, геологическая информация, незатронутые мобы) в памяти и перезагрузке только динамических данных (таких как позиция игрока, статистика игрока, статус квеста, инвентарь) ,
Так как это стоит больше денег и времени, разработчики игр обычно этого не делают.
источник