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

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

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

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

47 голосов | спросил Meshette 18 J000000Thursday13 2013, 14:17:36

6 ответов


54

Хорошо, теперь - какой простой, но интересный вопрос для решения.

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

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

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

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

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

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

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

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

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

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

Итак, для файтинга при выполнении реванша (не от раунда к раунду) вам нужно:

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

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

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

Надеюсь, это пролило свет на ваш вопрос.

ответил Tom 'Blue' Piddock 18 J000000Thursday13 2013, 15:19:27
14

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

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

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

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

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

ответил Sean Middleditch 18 J000000Thursday13 2013, 20:29:13
7

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

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

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

ответил Jack Aidley 18 J000000Thursday13 2013, 18:39:22
2

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

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

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

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

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

ответил linac 19 J000000Friday13 2013, 11:32:46
2

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

Почему вам стоит просто полностью перезагрузить уровень

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

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

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

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

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

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

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

Итак, как вы оптимизируете? Ну, если проблема с уровнем re -гружения, то проблема не в уровне loading ? Если вы считаете, что это просто перезагрузка, почему люди перезагружают ваш уровень намного чаще, чем просто загружают уровень в первую очередь? Звучит как проблема с игровым процессом, а не с проблемой разработки кода. Кто думает, что его весело перезагружать уровень снова и снова, и просто хочет, чтобы быстрее вместо полностью избегали ?

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

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

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

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

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

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

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

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

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

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

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

ответил BrianH 19 J000000Friday13 2013, 22:17:22
0

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

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

ответил Xtro 22 J000000Monday13 2013, 04:29:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132