Как загружаются игры?
Как только ты кликаешь по ярлыку игры, компьютер запускает множество процессов. А каких — расскажем в этой статье.
Говорить будем про игры на движке Unreal Engine, так как у него есть понятная документация по загрузке, а сам он популярен. У нас есть студент, Паша, который разбирается в этой теме, он нам и расписал все подробности.
Кстати, будет душно. Мы предупредили.
А если тебе лень читать, мы выпустили видео. Можешь посмотреть его:
Как только ты запустил игру, запустилась целая экосистема, которая взяла под контроль компьютер: процессор, видеокарту, оперативную память, звук, сеть, устройства ввода и файловую систему.
Вот как это происходит
Первым делом операционная система загружает исполняемый файл игры. Это скомпилированный код проекта, и, в зависимости от платформы, он может быть:
- .exe — для Windows
- .app — для macOS
- бинарный ELF-файл — для Linux
- образы для PlayStation 5 и Xbox Series X/S
Далее ОС выделяет память под начальный загрузчик и передаёт управление игре.
Проверка системы и API
Unreal Engine начинает с того, что проверяет железо: запрашивает характеристики процессора, объём доступной RAM и VRAM, модель видеокарты и версию операционной системы.
Затем движок проверяет наличие нужных API — специальных интерфейсов, через которые он общается с железом. Своего рода переводчики между Unreal Engine и твоей системой. Без них игра просто не поймёт, как работать с видеокартой, аудиоустройствами или сетью.
Хорошая аналогия: ты в чужой стране и хочешь открыть счёт в банке. Без переводчика никак. Так и Unreal Engine без API ничего не сделает.
Вот примеры нескольких API:
- DirectX
- Metal
- Vulkan
- Windows API
- Steamworks
- а для консолей PSN или Xbox Live API
DirectX 12, например, использует дескрипторы — специальные указатели на текстуры, буферы и шейдеры в видеопамяти. Это позволяет минимизировать обращения к CPU. Vulkan на Linux работает схожим образом. Windows API управляет окнами и системными событиями.
И уже на этом этапе загрузки возможны ошибки. Например:
- Нет нужной версии DirectX
- Не установлены критические библиотеки
- Устаревшие драйвера
- Конфликт оборудования
В этих случаях игра не запускается, либо запускается с ошибкой. Хорошие сборки могут дать понятную подсказку: «отсутствует библиотека X» или «не поддерживается видеокарта».
Проверка лицензии
Следующий этап — проверка лицензии. Это особенно важно при запуске через Steam, Epic Games или консоли.
Движок подключается к интернету и проверяет, есть ли у пользователя право запускать игру. Для этого используются внутренние библиотеки клиента: Steam API, Epic Online Services, PSN SDK и так далее. На консолях этот процесс встроен в операционную систему и работает через API платформы.
Если лицензия подтверждена — движок продолжает работу. Если нет — игра закрывается или предлагает перейти в офлайн-режим, отключив проверку облачных сохранений.
Инициализация подсистем
Наконец с проверками покончено, можно запускать ключевые подсистемы. Происходит это в определённом порядке:
- Графическая подсистема. Подключает шейдеры, выделяет память под текстуры, геометрию, настраивает инструкции для GPU — как именно рисовать сцену. На этом этапе активируются Nanite, если он используется, и настраивается рендер-пайплайн.
- Физическая подсистема. Chaos Physics — физический движок Unreal Engine — отвечает за столкновения, симуляции и взаимодействие объектов. Он использует иерархические структуры (BVH) для быстрой проверки пересечений.
- Звуковая система. Подключаются драйвера и звуковые API: XAudio2, Core Audio, Tempest 3D (на PS5). Устанавливаются звуковые каналы, громкости, эффекты.
- Сетевая подсистема. Если игра поддерживает мультиплеер, запускаются системы для соединения с другими игроками: через Epic Online Services, Steam или сторонние решения на UDP/TCP.
- Система ввода-вывода. Она обрабатывает сигналы от мыши, клавиатуры, геймпада или других контроллеров. Используются DirectInput, SDL, XInput или нативные API консолей.
- Файловая подсистема. Загружает игровые ресурсы из архивов .pak. Это единый формат, в котором Unreal упаковывает текстуры, ассеты, модели, аудио и логику. Это ускоряет чтение, позволяет проверять целостность и загружать только нужные элементы.
Компиляция шейдеров
Затем начинается, пожалуй, самый долгий и раздражающий этап — компиляция шейдеров.
Шейдеры — это небольшие программы, которые говорят видеокарте, как именно отрисовывать материалы, свет, тени и спецэффекты. Они пишутся на высокоуровневом языке, например, HLSL, но должны быть переведены в машинный код конкретной видеокарты.
Проблема в том, что у всех разное оборудование. И каждая видеокарта требует свой набор инструкций.
Unreal собирает сотни, а иногда и десятки тысяч шейдеров. Этот процесс может занять от нескольких минут до получаса, особенно в проектах с обилием материалов.
Обычно шейдеры компилируются один раз — при первом запуске. В дальнейшем движок использует готовый кэш. Повторная компиляция может потребоваться при установке DLC, смене видеокарты или обновлений движка. Или если разработчики по какой-то причине забыли включить использование кэша.
- Неподдерживаемое железо
- Устаревшие драйвера
- Некорректные .pak-файлы
- Перегрузка CPU из-за физики
- Блокировка записи в папку с игрой
- Конфликт с антивирусом или правами доступа
Меню игры
Само меню — это отдельная сцена. Его загрузка активирует весь набор систем: UI, интерактивные элементы, отклик на нажатия, анимации интерфейса.
После загрузки движка и появления главного меню начинается следующий этап — запуск первого уровня и переход к самому игровому процессу.
Эта часть включает в себя подгрузку мира, рендеринг, физику, звуки, взаимодействие с игроком, а также сетевые функции, если игра поддерживает мультиплеер. Про некотороые расскажем отдельно.
Загрузка уровня
В Unreal Engine уровни представлены как Persistent Level — основной, постоянно активный уровень. Он может содержать ландшафт, освещение, архитектуру и базовую логику.
Если уровень большой — например, открытый мир — используется система World Partition. Она разбивает карту на ячейки и загружает только те, что находятся рядом с игроком. Это снижает нагрузку и экономит ресурсы.
Для небольших сцен, вроде главного меню или заставки, применяется обычный Level Streaming — подгрузка ассетов по мере необходимости. Всё это работает через .pak-файлы — архивы с текстурами, моделями, звуками и логикой.
На этом этапе активно используется Texture Streaming Pool — система, которая выделяет объём видеопамяти под текстуры.
Например:
- до 12 ГБ VRAM на Windows и консолях
- 6–8 ГБ на macOS и Linux
Если текстур слишком много — движок начнёт заменять их на более низкое качество, чтобы избежать перегрузки.
Рендеринг сцены
Как только мир загружен, запускается система рендеринга. Именно она превращает 3D-данные в изображение на экране.
На Windows это чаще всего DirectX 12, который использует Command Lists — инструкции для GPU. На Linux и macOS — Vulkan или Metal, а на консолях — собственные API: GNMX на PS5, DirectX Ultimate на Xbox.
Современные проекты используют Nanite — технологию виртуализации геометрии. Она позволяет отрисовывать десятки миллионов полигонов без потерь в производительности. Движок автоматически подгружает только ту детализацию, которая видна в кадре, снижая нагрузку на GPU и минимизируя количество вызовов отрисовки (draw calls).
Динамическое освещение
За глобальное освещение отвечает Lumen — система, которая использует трассировку лучей и поля расстояний (Signed Distance Fields) для расчёта света, теней и отражений.
Если видеокарта поддерживает аппаратный Ray Tracing — например, через RT-ядра NVIDIA или AMD — Lumen использует их напрямую. В противном случае применяется программная трассировка, которая ложится на CPU и может снижать FPS.
Чтобы скомпенсировать это, включается Temporal Super Resolution — технология апскейлинга, позволяющая рендерить картинку в более низком разрешении и масштабировать её до 4K с минимальными потерями.
Пользовательский интерфейс
Интерфейс в Unreal Engine построен на Widget Blueprints — визуальных элементах UI. Кнопки, панели, курсор, миникарта и прочие элементы интерфейса обрабатываются движком отдельно от игровой сцены.
Логика управления интерфейсом может быть реализована как через Blueprints, так и на C++ — в зависимости от сложности проекта.
Каждое нажатие, каждое движение мыши — это событие, которое движок ловит через систему ввода и связывает с нужным действием.
Физика и взаимодействие
Физический движок Chaos отвечает за поведение объектов: столкновения, падения, взрывы, разрушения. Он использует BVH (Bounding Volume Hierarchies) — иерархии, которые позволяют быстро определять, какие объекты соприкасаются. При необходимости можно использовать Constraint Solvers — системы, рассчитывающие соединения между объектами: верёвки, мосты, мягкие тела. Если используется Physics Materials, можно задавать параметры трения, отскока и плотности для каждого объекта.
Анимации и логика
Анимации управляются через Animation Blueprints. Например, персонажи используют Full Body IK Solver, чтобы ноги правильно стояли на поверхности.
Параллельно работают Behavior Trees — древовидные структуры, управляющие поведением NPC: атаки, уклонения, патрули, диалоги.
Игровой цикл
Всё это работает внутри основного цикла игры — Game Loop, который состоит из трёх этапов:
- Update — обновление состояния мира: физика, анимации, AI
- Tick — обработка ввода игрока
- Render — отрисовка кадра
- Tick-система фиксирует нажатие
- Игровая логика двигает персонажа
- Физика рассчитывает столкновения
- Анимация подстраивает походку
- Рендеринг выводит всё на экран
Сетевые функции
Если игра мультиплеерная, включается Network Subsystem. Она использует Replication System — механизм синхронизации между клиентами и сервером. Для этого могут использоваться:
- UDP или TCP-соединения
- Epic Online Services
- Steamworks
- PSN/Xbox Live SDK
Сеть может управлять не только перемещением игроков, но и объектами, голосовым чатом, сохранениями, телеметрией.
Звук
За звук отвечает Audio Mixer или сторонние системы вроде FMOD и Wwise. Они управляют воспроизведением музыки, звуков окружения, эффектов, голосов. Поддерживается пространственное позиционирование, 3D-звук, реверберация.
Звуковая система интегрируется с физикой и событиями: звук шагов зависит от поверхности, выстрел — от оружия, эхо — от расположения стен.
Поддержка платформы
Попутно работают нативные API, которые обрабатывают системные события, окна, разрешения, курсор, режимы экрана и другие элементы взаимодействия с операционной системой:
- WinAPI — на Windows
- Cocoa — на macOS
- X11/Wayland — на Linux
- OS SDK — на консолях
Когда все эти системы запущены и синхронизированы — начинается активная часть игрового процесса. Ты видишь игровой мир, взаимодействуешь с ним, управляешь персонажем, слышишь музыку, получаешь отклик.
Движок, каждую секунду координирует десятки сложных процессов — чтобы всё выглядело и ощущалось как единое живое пространство.
Есть такая программа Unreal Insights. С её помощью можно разобрать сцену игры и посмотреть, как загружается каждый отдельный элемент. И то, что ты видишь на экране, происходит в считанные миллисекунды, да ещё и обновляется.
Выход из игры
В этот момент начинается финальный этап — корректное завершение работы всех подсистем Unreal Engine и освобождение ресурсов.
На первый взгляд — просто. Но под капотом происходит множество действий, которые важно организовать правильно, чтобы избежать утечек памяти, ошибок и повреждений данных.
Сигнал завершения
Вернёмся к выходу из игры. Это событие фиксируется через Input Subsystem или Window Manager, в зависимости от платформы:
- На Windows — через WM_CLOSE
- На macOS — через Cocoa ApplicationDelegate
- На Linux — через X11/Wayland события
- На консолях — через SDK событий платформы
После получения сигнала движок начинает процедуру graceful shutdown — «мягкого завершения».
Сохранение данных
Первый шаг — сохранение всего, что должно быть сохранено:
- Прогресс игрока (системы SaveGame, JSON/INI/Custom binary)
- Настройки графики и управления
- Состояние сессии — в сетевых играх: позиция, инвентарь, события
- Облачные сохранения через Steam Cloud, Epic Cloud, PSN/Xbox Live
На этом этапе возможны сбой и потеря прогресса, поэтому разработчики часто реализуют автосейв перед выходом.
Деактивация подсистем
После этого Unreal Engine поочерёдно завершает работу ключевых подсистем.
1. UI / Widget System
— Закрываются все активные виджеты и интерфейсные элементы.
— Прерываются анимации и обработка нажатий.
— Объекты UI удаляются из памяти.
2. Gameplay и логика
— Удаляются все Actor’ы, Components и Blueprint-сущности.
— Останавливаются таймеры, тики, AI-бихейворы, event dispatchers.
— Вызываются события EndPlay для каждого объекта.
3. Physics и анимация
— Прекращается симуляция Chaos Physics.
— Завершается работа IK-солверов и анимационных графов.
— Освобождаются ресурсы, связанные с коллизиями и телами.
4. Аудиосистема
— Останавливаются все проигрываемые звуки.
— Завершается обработка эффектов: реверберация, пространственное позиционирование.
— Отключаются аудиодвижки: FMOD, Wwise, AudioMixer.
Если мы говорим про онлайн-игры, то происходят:
- Отключение от сервера
- Завершение сессии
- Синхронизация данных
- Закрытие портов или WebSocket-соединений
- Очистка памяти
- Удаляются неиспользуемые UObjects, Textures, Meshes, Sounds
- Очищается GPU-память от загруженных материалов и рендер-целей
- Закрываются файлы .pak и стриминговые каналы
- Удаляются временные буферы, ассеты, кэш-компиляции
Завершение рендеринга и окон
Финальный этап — отключение графического вывода:- Завершаются рендер-пайплайны
- GPU сбрасывает все активные команды
- Удаляются Render Targets, Post-Process Chains, Depth Buffers
- Окно приложения закрывается через системный вызов. Например, DestroyWindow на WinAPI
Выход из процесса
После завершения всех задач Unreal Engine завершает свой основной цикл:- Останавливаются все потоки
- Завершается работа Game Thread, Render Thread, Audio Thread, RHI Thread
- Возвращается код завершения в операционную систему (обычно 0, если всё прошло корректно)
- Процесс закрывается
Возможные проблемы при выходе
Ну и куда же без ошибок. Вот некоторые из типичных проблем:- Зависание при выходе из-за висящих потоков
- Утечка памяти, если объекты не были удалены
- Недосохранённые данные
- Разорванное соединение с сервером до отправки финальных пакетов
- Краш при закрытии из-за обращения к уже уничтоженному объекту
Возможные последние этапы
Многие студии добавляют на этапе выхода:- Отправку аналитики — сколько играл, как закрыл, на каком уровне
- Проверку ошибок — краш-репорты, телеметрия
- Уборку мусора — удаление кэша, логов, временных файлов
- Релиз соединений с внешними API — Discord Rich Presence, Twitch, OBS SDK и т.д.