Одна из самых больших проблем в современных играх - бессмысленное и постоянное ожидание загрузки данных. И если, порой, это можно как-то объяснить, то, нередко, встречаются ситуации, когда ожидания можно и избежать.
В чём суть проблемы
Разработчики разрабатывают игры, а вот выпускают из издатели. Разработчики - это про закрытие текущего набора задач, а издатели - это про деньги. И если контроль качества может выявить неверное поведение в игре, то он почти никогда не укажет на чрезмерное ожидание загрузки ли нового этапа или восстановление в точке возрождения.
Если вам доводилось играть в Elden Ring и сражаться с Маленией, то, как никто другой знаете, что бой может закончиться очень быстро, а загрузка будет гарантированно медленной. Нередки случаи, когда загрузку ждёшь минуту, а сражаешься 10-20 секунд.
И вот эти самые долгие и бессмысленные ожидания являются источником раздражения, ведь мы играем в игры, чтобы получать от процесса удовольствие, а не ожидать, пока очередной набор данных загрузится.
К счастью, есть набор методических рекомендаций, позволяющий обыграть задержки так, что пользователь их либо не заметит, либо практически не заметит.
Немного теории
Что бы ни приходилось грузить - это всегда данные. И практически всегда, это заранее известный объём данных, практически гарантированно загружающийся примерно одно и то же количество времени. И это первый и самый важный теоретический момент: мы можем прикинуть, сколько времени будет загружаться тот или иной блок данных на не самом быстром диске с не самой быстрой памятью; проще говоря, мы заранее можем определить, сколько данные будут грузиться в самом пессимистичном случае.
Второе, что мы должны для себя решить - это предельное время ожидание игрока или сколько секунд пользователь может подождать без раздражения.
Зная время загрузки данных и предельное время ожидание - можно получить главную метрику: рекомендованный предельный объём загружаемых данных.
Теперь, когда у нас есть некоторая метрика, от которой можно оттолкнуться, можно перейти к практическим советам, как ускорить игру.
Гибкая загрузка
Часто, данные для уровней хранятся в пакетах и если надо перезагрузить даже часть уровня - приходится перезагрузить все данные целиком. Однако, если данные поделить на несколько типов и сделать загрузку более прицельной (отдельно грузить текстуры для разных частей уровня, отдельно - скрипты и всё в таком духе), то общее время загрузки данных может возрасти, зато потребность загружать сразу много лишних данных практически исчезнет.
Так же появится возможность держать в памяти часть ключевых данных, не зависимых от уровня без необходимости выгружать их при смене уровня.
Данный подход можно представить в виде большого количества файлов с разноплановыми данными и оглавлением, позволяющим загружать данные по необходимости.
Однако, этот подход может быть лишь частью общей оптимизации; есть и организационные механизмы, которые следует закладывать на уровне проектирования игры.
Комнаты-переходы
Это специальные комнаты, время прохода через которые заранее предопределено и не может быть сокращено никакой уловкой. Покуда персонаж проходит комнату насквозь - загружается соседняя комната, но не целиком, а лишь её часть. И покуда игрок не покинул комнату-переход, предыдущая комната, которую персонаж покидает, не выгружается из памяти: он ведь может ещё и передумать.
Использование такого механизма порождает сразу несколько важных манёвров:
- Комнаты вокруг комнаты-перехода должны быть "лёгкими", то есть должна быть возможность держать в памяти сразу несколько таких комнат;
- Каждая комната вокруг комнаты-перехода, также является своеобразной комнатой-переходом: после попадания в неё из памяти выгружается всё лишнее и начинается загрузка комнаты целиком.
Замкнутые пространства
Это частный случай комнаты-перехода и данный приём вовсе не предполагает, что комната, в которой появляется персонаж - тёмная глухая пещера. Это может быть комната открытого мира, у которой есть широкий обзор с большим количеством деталей, но все эти детали - просто изображение, натянутое на полуцилиндр, дополненное параллакс-эффектом.
Замкнутые пространства обладают относительно небольшой ёмкостью данных и могут весьма быстро загружаться, однако в силу высокого ограничения пространства для действий, они могут и должны использоваться лишь как предварительная мера: покуда игрок будет выходить из данного пространства, остальная часть этапа успеет подгрузиться.
Загрузка во время кат-сцены
Это классика жанра, хотя это и является, зачастую, одноразовым мероприятием: покуда воспроизводится заскриптованная сцена, грузится следующий уровень, который позволит продолжить играть сразу как сцена закончится. Даже раньше.
Тропа загрузки
Этот приём - игра в игре. Суть сводится к тому, что грузится некоторая комната ожидания и игрок в ней находится столько, сколько необходимо для загрузки этапа. В процессе продвижения по комнате (это может быть какая-то дорожка или падение вниз со сбором каких-нибудь ценных ресурсов) может раскрываться побочная часть сюжета, что-то рассказываться и всё в таком духе.
Уточнение загрузки
Данный приём позволяет грузить ресурсы в несколько шагов. На первом грузится минимальный набор данных, обеспечивающих лишь общие контуры комнаты (скажем, низкополигональные изображения). Затем, неспеша прогружаются текстуры и высокополигональные фигуры - самое "тяжёлое". По мере загрузки данных, всё вокруг начинает принимать более ожидаемый внешний вид.
Это выглядит не особо привлекательно, однако если использовать вместе с прочими подходами - будет вполне себе рабочий подход.
Заключение
По сути, главная задача любого разработчика сделать так, чтобы пользователь не ждал. Потому что ожидание наводит на грустные мысли (а может всё зависло?) и портит положительное впечатление от игрового процесса.
Более того, рассчитывать надо всегда на пользователя со "слабым железом"; на сильном железе всё будет и так "летать", но таких игроков, по статистике, всегда меньше.