Что такое файлы в игре

Обновлено: 06.07.2024

Статья написана специально для телеграм-канала Коздима Гений .

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

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

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

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

Что такое сохранение?

Дадим определение понятию "сохранение".

Сохранение - это информация о прогрессе прохождения игры, хранящаяся на жестком диске или в облаке. Для каждого отдельного игрока это будет своя уникальная информация.

Сохранение игры так же называют сейвом или сейв-файлом .

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

1. Список объектов, для которых необходимо хранить информацию состояния;

2. Для каждого объекта указан список изменяющихся параметров;

3. Каждый параметр имеет свой определённый код, по которому игра может определить, что с ним происходит на текущий момент.

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

Вот так выглядит структура файла сохранения TES V: Skyrim Вот так выглядит структура файла сохранения TES V: Skyrim

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

Как работает сохранение?

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

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

Для воспроизведения реплеев в игре DOTA 2 игра запоминает каждое действие, совершенное игроками во время матча. В момент воспроизведения игра просто считывает, какие клавиши были нажаты игроками и применяет их на предварительно загруженные модели персонажей и статусы игроков.

Для ускорения процесса сохранения-загрузки применяется процесс в программировании, который называется сериализация . Он переводит информацию об объектах в формат, удобный для хранения и чтения (например, XML). При загрузке файла он считывается игрой, и все объекты получают сохранившиеся состояния и свойства.

Зачем нужно сохранение?

Сохранения выполняют несколько важных функций, способных улучшить игровой опыт.

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

На старте продаж Готики 3 вид этого экрана занимал около 40% времени, проведённого за игрой из-за ужасной оптимизации. После нескольких патчей на него смотришь только 10% времени На старте продаж Готики 3 вид этого экрана занимал около 40% времени, проведённого за игрой из-за ужасной оптимизации. После нескольких патчей на него смотришь только 10% времени

Во-вторых , сохранения позволяют игрокам вернуться к тому месту в игре, в котором она прервалась в прошлый раз. Игрок загружает игровой "срез", а игра расставляет все объекты по своим местам и даёт игроку управление. Другими словами, игра не даёт потерять игроку весь прогресс, который он совершил до текущего момента. Это особенно актуально для современных игр с большим количеством геймплейных часов, которые невозможно пройти за один игровой сеанс (если вы не спидраннер).

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

В XCOM 2 даже при высокой вероятности попадания герои умудрялись промахиваться мимо врага. Это заставляло самых нетерпеливых игроков перезагружать игру много раз В XCOM 2 даже при высокой вероятности попадания герои умудрялись промахиваться мимо врага. Это заставляло самых нетерпеливых игроков перезагружать игру много раз

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

Какими бывают сохранения?

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

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

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

Так же паро��и не позволяли игроку восстановить собственный прогресс - игра загружала уровень в его первоначальном состоянии, с самого начала.

Ну, кто запомнит такие длинные пароли для открытия всех уровней в игре Crash Bandicoot? Ну, кто запомнит такие длинные пароли для открытия всех уровней в игре Crash Bandicoot?

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

Для примера я возьму open-world игру GTA: Vice City . Сохранения игры происходят в строго определённых местах (отель Ocean View, вилла Варсетти, таксопарк и т.д.). При загрузке этих локаций игра загружала минимальный набор объектов (пешеходов, автомобили, оружие) и продолжала их подгружать по мере игры. Особенность этих мест заключается в том, что в поле зрения игрока на момент загрузки находится очень мало объектов, и он не видит фоновую загрузку локации.

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

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

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

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

Ручное сохранение сохранения позволяет игроку сохранить свой прогресс в произвольном месте, открыв специальное меню. Быстрое сохранение ( quick save ) позволяет игроку сохранить игру в произвольном месте при нажатии на одну клавишу. Данная функция распространена в играх, созданных для ПК, хотя за последние пять лет она перебралась и на консоли. Иногда такое сохранение при загрузке возвращает игрока к ближайшему пройденному чекпоинту.

Как сохранения представлены в видеоиграх?

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

Так, в Silent Hill 3 сейв-поинтами была нарисованная пентаграмма, которая являлась символом культа Сайлент-Хилла. Этот символ означал перерождение Бога в человеческой плоти, которое является основной темой игры.

В GTA: Vice City пестом сохранения была иконка с аудиокассетой - одним из символов 80-х, в которых происходит действие игры.

В игре Postal 2 в случае частого сохранения Чувак реагировал на это словами "Даже моя бабушка смогла бы пройти игру меньше сохраняясь!", разрушая четвёртую стену.

В игре Call of Ctulhu: Dark corners of the Earth рейтинг прохождения уменьшался, если игрок сохранялся слишком часто.

А вот в игре Metal Gear Solid игра могла прочитать сохранения других игр с карты памяти PlayStation. В одной из битв с боссом Mantis, если на карте памяти были другие игры Konami, то этот босс зачитывал их названия. Это производило ошеломляющий эффект на игрока (не зря же Кодзима - гений). Кстати, в этой игре для сохранения своего прогресса необходимо было позвонить по рации на определённую частоту, что тоже являлось частью игрового действия.

Заключение

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

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

Ну и в самом конце, хочу вспомнить замечательные строчки из стихотворения Алексея Свиридова :


Недавно с содроганием осознал, что мой геймерский опыт превышает 20 лет. В первую игру я поиграл где-то в 1994-1995 году, уже даже не припомню, что это была за игра, но помню, что играл в нее я на приставке от Nintendo. И вот играл я себе, играл, практически все эти годы (с некоторыми перерывами), и несколько лет назад мне вдруг стало интересно, как же все эти игрушки работают, и я занялся моддингом.

Первое с чем я сполкнулся, это игровые архивы. Для большинства игр, чтобы сделать дополнение, необходимо распаковать ее ресурсы. Вот и стал я искать программы способные это сделать. За несколько лет модостроительства пользовался несколькими десятками, если даже не сотнями подобных прог, но в оновном юзаю штук 5-10.

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

Итак, первая такая программа, о которой я хочу рассказать это Game Extactor.


Game Extractor – поддерживает распаковку архивов более чем 1400 игр и программ, имеет возможность подключения дополнительных BMS-скриптов для распаковки. Кроме того, программа способна открывать и распаковывать архивы еще не меньше сотни игр и программ, не внесенных разработчиками в список поддерживаемых, доводя таким образом число поддерживаемых игр как минимум до полутора тысяч. Программа также способна открывать обычные ZIP, RAR, TAR и другие типы архивов, которые часто используются в играх, в особенности в инди-проектах. Платная версия программы способна также упаковывать файлы в любой из поддерживаемых типов архивов и заменять в них файлы. Для работы обоих версий программы, требуется установить Java.

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

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

Последняя версия: Game Extractor 2.01


Вторая и третья, практически идентичные программы, но со своими нюансами:



QuickBMS и QuickBMS GUI – сами по себе, эти программы не могут распаковывать ресурсы игр, это только оболочка для запуска BMS-скриптов. Отличает эти программы способ открытия файлов, первая после запуска сразу открывает окно выбора скрипта, затем архива и папки назначения, полностью портативна (то есть не требует установки), вторая имеет полноценный графический интерфейс, инструменты для создания и редактирования скриптов и ей необходима установка. Энтузиастами написаны тысячи скриптов для данных программ. Только на официальной странице программы их более 1000, некоторые из них способны упаковывать и распаковывать десятки игр, таким образом количество поддерживаемых игр и программ превышает 2000. Есть возможность запуска плагинов для Total Commander.

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

Недостатки: необходимость вручную выбирать скрипты

Последняя версия: QuickBMS 0.6.1d, QuickBMS GUI 2.0 beta

Благодаря четвертой программе, появились на свет две предыдущие:

MultiEx Commander – неплохая программа для распаковки ресурсов игр. Поддерживает распаковку более 400 игр, установку собственных плагинов (которых не очень много, но все же, их можно найти в бескрайних просторах сети), скрипты BMS и дополнения для Game Extractor. Теоретически, должна поддерживать несколько тысяч игр и приложений, но на самом деле, не все так радужно, далеко не все скрипты дружат с данной прогой.

Достоинства: поддержка дополнений различных типов.

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

Пятая прога - одна из лучших:


Dragon Unpacker – без преувеличения, одна из лучших программ в своем роде. Способна открыть и распаковать более 600 разновидностей ресурсов игр и программ. Кроме того, имеет функцию сканирования архивов на файлы определенных типов, которые устанавливаются в настройке программы. Таким образом можно извлечь из почти любого архива, музыку, изображения и видео популярных в игровой индустрии форматов, при условии что он не зашифрован.

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

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

Последняя версия: Dragon Unpacker 5.7.1, стабильная версия: 5.7.0


И, наконец, последняя на сегодня:


Game File Explorer – распаковщик и просмотрщик игровых ресурсов. Он поддерживает всего лишь около 60 форматов архивов из нескольких десятков игр. Кроме распаковки/упаковки архивов имеет возможность просмотра изображений, в том числе некоторых редких форматов, некогда используемых в видеоиграх. Применяется в основном для моддинга игр 1990-х-нач. 2000-х.

Достоинства: возможность просмотра изображений игровых форматов прямо в окне программы.

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

dlll в папке

Что такое DLL файлы, и для чего они нужны? Аббревиатура DLL – обозначает «Динамически Подключаемую Библиотеку». Она установлена, во всех операционных системах Windows, и практически каждая программа или игра на компьютере пользуется данной библиотекой. В ней содержится информация о конфигурации системы, совместимости устройств, наборе команд для правильной работы и многое другое. Некоторые файлы для игр имеют в своих папках уже готовые библиотеки, остальные пользуются системными.

Зачем нужны DLL компоненты

Если вкратце: что такое DLL файлы? – это компоненты библиотеки, а нужна она для запуска программ, приложений и игр. Компьютер включился, и система работает исправно. Вы еще ничего не запускали и не открывали, а уже десятки DLL файлов используются. Простые часы, информация о конфигурации системы, порядок запуска программ, оформление и многое другое используют библиотеку. Для того чтобы в текстовом документе начали появляться символы, соответствующие вашему вводу, нужна библиотека. По умолчанию система не знает, что означает нажатая вами клавиша,─ в этом его помогают компоненты DLL. Аналогичная ситуация со всеми подключаемыми устройствами: принтером, мышью, клавиатурой, флеш-картой. Именно библиотека DLL файлов «рассказывает» им, как работать с параметрами вашей системы.

Работоспособность элементов

Важно обновлять периодически систему и библиотеку, неактуальные файлы приведут к отказу работы программы. К примеру, вы установили игры пятилетней и большей давности, они у вас работают нормально. Далее вы поставили новую часть игры, которой не более года. Она может у вас не запуститься. Система выдаст следующее оповещение: ошибка DLL, отсутствует файл. Оно означает, что файлы нерабочие или вовсе его нет на компьютер. Связано это с тем, что программы или игры, которые пользуются библиотекой, могут вносить изменения. К примеру, вы установили игру, но параметры разрядности системы и версию ОС указали неверно.

Текущие файлы будут перезаписаны, и программа работать перестанет. Раз отсутствует DLL, значит, его нужно скачать и поместить в систему вручную. Но в большинстве случаев, новые игры требуют новых файлов, которых вообще не было в старых сборках системы, и решение одно - установить или обновить весь пакет.

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

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

К примеру каким образом хранятся данные в игре "Космические рейндежры"? У каждого НПС есть свой корабль, свое оборудование и характеристики, он не пропадает из игры и не появляется в рандомном месте мира, его положение всегда известно. Помимо этого в игре есть поиск по всем объектам. Если игра использует БД, то как именно она выглядит и реализуется? (Я понимаю что это может быть не известно, но хотя бы теоретически, или как бы вы реализовавали подобное)

Оценить 6 комментариев

copal

А Вас не посещала мысль что эти вопросы должны волновать только тех кто делает игры? Вам-то какая разница?

copal: А вас не посещала мысль, что если я задаю вопрос, то я хочу услышать на него ответ, а не рассуждения о том, зачем мне это? Вам-то какая разница?
(Я знаю какая мне разница и зачем мне это)

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

copal

Neyury: это хорошо что понимаете. А вот теперь представьте что я тоже не понимаю зачем Вам это нужно. Хотите знать как устроен квантовый мир, станьте физиком, иначе Вы даже ответа не поймете.

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

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

Я тоже пытаюсь разобраться, разведать, и понять то, что меня сейчас волнует.

copal

ArXen42

  1. В игре, разумеется, есть некая модель вселенной. В моем случае это звездные системы, которые являются контейнерами для SpaceObject'ов, в которые уже входят планеты/корабли и другие объекты.
  2. Таким образом, состояние игры можно сохранить как звездные системы и их содержимое, ну и не забыть сериализовать вспомогательные коллекции, типа капитанов кораблей и другой глобальной информации.
  3. Сериализация вселенной происходит в json. Я пишу игру на unity3d, поэтому мне кажется удобным использовать местный JSONUtility, умеющий проводить сериализацию простых классов (т.е. публичные поля и простые коллекции). Процесс таков: для всего, что я хочу (де)сериализовать, создаю класс-прокси, отражающий в простой форме (без всяких конструкторов, свойств, приватных членов и всего такого) содержимое нужного мне класса, с которым я уже и работаю.
  1. Создаем прокси для StarSystem, он в себя копирует информацию о системе.
  2. Когда доходим до списка объектов, для каждого из них создаем уже класс-прокси объекта и результирующий экземпляр уже заносится в прокси StarSystem.
  3. И т.д., пока сложные объекты не закончатся.
  4. В итоге, имеем матрешку из прокси-классов. С помощью JSONUtility она одной строчкой может быть переведена в json или восстановлена из него.
  5. Ну а сами сериализуемые классы должны уметь получать информацию из своих проксей при загрузке из сохранения.

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

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

ArXen42

Стоит добавить, что у меня не стоит задачи подгружать данные динамически (для чего как раз удобны БД) - все игровое состояние сохраняется и загружается полностью, не по кускам. Для игры с огромной вселенной типа Elite такой подход может быть слишком накладен и понадобится загрузка данных кусками, что без БД, наверное, не слишком удобно.
Пример - minecraft, с его загрузкой чанками.

ArXen42

zhora41, не уверен, что сейчас (спустя >2 лет с момента ответа) я бы стал делать так же, но ООП ведь само по себе не дает ответа на то, как "записать данные в файл". Особенно сложные данные, образующие нетривиальный граф зависимостей.

JSON это не кульбит, а просто формат хранения данных. Можно в xml, можно в бинарном виде, суть не поменяется.

Читайте также: