TextFizz
  1. Главная
  2. Гайды
  3. Как старые игры запускаются прямо в браузере
Guide

Как старые игры запускаются прямо в браузере

Эмулятор DOSBox на WebAssembly, архив игры в памяти вкладки, сохранения внутри эмулятора и разбор чёрного экрана: что стоит за кнопкой «Играть».

Обновлено: ·7 мин чтения
Как старые игры запускаются прямо в браузере

Старая игра идёт в браузере не потому, что её переписали на JavaScript, а потому, что вместе с ней запускается эмулятор: DOSBox, собранный в WebAssembly. Он изображает процессор x86, звуковую карту и саму DOS, а игра остаётся тем же файлом начала девяностых. Устанавливать нечего — этот «компьютер» приезжает во вкладку парой мегабайт кода и живёт, пока вкладка открыта.

Начать проще всего с раздела ретро-игр: единственная кнопка, которую нужно нажать, называется «Играть в браузере».

Коротко

  • Внутри страницы работает DOSBox, скомпилированный в WebAssembly (проект js-dos). Эмулятор считает всё в вашем браузере, на нашем сервере игра не крутится.
  • Первый запуск тянет эмулятор (около 2 МБ) плюс архив игры — от 1 до 40 МБ. Размер написан на странице каждой игры, дальше файлы берутся из кеша.
  • Клавиатура уходит в игру только после клика по чёрному экрану. Звук включается тоже после клика — это правило браузера.
  • Сохранения пишутся в файловую систему эмулятора, которая живёт в памяти вкладки. Перезагрузили страницу — начинаете с начала уровня.
  • Чёрный экран после нажатия кнопки лечится обновлением страницы: эмулятор иногда не поднимается с первого раза.

Что происходит после кнопки «Играть»

Порядок всегда один и тот же, и знание этого порядка экономит время, когда что-то пошло не так.

  1. Грузится ядро эмулятора. До нажатия кнопки его нет на странице совсем: тянуть два мегабайта wasm каждому, кто просто открыл текст, было бы невежливо. Поэтому кнопка на секунду становится неактивной.
  2. Скачивается архив игры. Это обычный zip с оригинальными файлами: исполняемый файл, ресурсы, конфиг. Ничего не распаковывается на диск — архив разворачивается в память вкладки.
  3. Эмулятор «включает компьютер». Появляется чёрный экран 4:3, внутри отрабатывает команда перехода в папку игры и запуск её exe-файла — ровно то, что вы набрали бы в DOS руками.
  4. Управление переходит игре. После клика по экрану нажатия клавиш перестают листать страницу и уходят в эмулятор.
Слои: страница, эмулятор, файлы игры внутри вкладки браузера
Игра не знает, что она в браузере: она видит процессор, память и звуковую карту, которые ей рисует эмулятор.

Почему ничего не нужно устанавливать

DOSBox существует с 2002 года и распространяется по лицензии GPL. Обычно его ставят программой: он изображает x86-процессор, память, видеорежимы от CGA до VESA и звуковые карты вроде Sound Blaster и AdLib, и делает это так, что игре не нужна ни настоящая DOS, ни настоящее железо.

WebAssembly добавил к этому одну вещь: возможность взять тот же самый код на C++ и скомпилировать его в формат, который исполняет браузер. Проект js-dos именно это и делает — упаковывает ядра DOSBox и DOSBox-X в wasm и даёт им экран, клавиатуру и звук браузера.

Отсюда и все остальные свойства. Ставить нечего, потому что программа приходит как часть страницы. Прав администратора не нужно. Операционная система не важна: Windows, macOS, Linux, Android — код исполняет браузер, а не система.

Отсюда же и безопасность. Игра из 1993 года не получает доступа к вашим файлам: она видит только ту файловую систему, которую ей нарисовал эмулятор, и та живёт внутри вкладки. Аккаунт не нужен, потому что заводить его негде — считать некому, всё происходит на вашей стороне.

И отсюда же главное ограничение: всё считает процессор вашей вкладки. Тяжёлые вещи вроде Quake на слабой машине идут медленнее, чем платформер 1991 года, и это не лечится настройками страницы.

Сколько это весит и почему второй запуск быстрее

Считать нужно два числа. Ядро эмулятора — около двух мегабайт, оно одно на все игры. Архив игры — своё для каждой: Wolfenstein 3D укладывается в полтора мегабайта, DOOM весит около четырёх, а Quake — девять.

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

Дальше работает кеш. Скачанные файлы браузер складывает в собственное хранилище (в коде плеера оно так и называется — js-dos-cache), и при следующем открытии страницы игра стартует почти мгновенно. Чистка данных сайта или режим инкогнито обнуляют этот кеш, и всё качается заново.

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

Почему после перезагрузки страницы сохранение пропадает?

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

Практический вывод простой.

Сохранение внутри игры работает, пока вкладка открыта. После F5 игра собирается из архива заново, и старый сейв не подтянется.

Это касается и настроек, которые игра пишет в свой конфиг: громкость, чувствительность мыши, переназначенные клавиши. Пока вкладка жива — всё на месте, после перезагрузки возвращается заводское состояние.

Что с этим делать: проходить эпизод за один заход, не закрывать вкладку между сессиями и не нажимать F5 в момент, когда захотелось «просто обновить». Длинные вещи вроде Civilization в браузере честнее считать игрой на один вечер, а не кампанией на месяц. В свежих версиях js-dos для постоянных сохранений появилось отдельное хранилище (OPFS), но в той сборке, что стоит у нас, его нет — обещать сохранность прогресса мы не будем.

Пойдёт ли это на слабом ноутбуке или телефоне?

Пойдёт, но по-разному. Эмулятор считает такты процессора DOS-машины на вашем процессоре, и цена этого зависит от игры: двухмерный платформер требует смешных ресурсов, трёхмерный шутер 1996 года — заметных.

Что реально помогает, по убыванию:

  • Закрыть лишние вкладки. Эмулятор делит процессор с ними, а не живёт отдельно.
  • Включить полный экран. Кнопка «На весь экран» отдаёт картинке всю площадь, а браузеру — меньше работы по масштабированию.
  • Выбрать игру по весу. Prince of Persia или Dune II идут там, где Quake уже спотыкается.
  • Не держать открытыми две игры одновременно. Два эмулятора в двух вкладках — два потребителя процессора.

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

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

Что обычно идёт не так

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

Клавиши листают страницу вместо игры. Симптом: стрелки прокручивают текст, пробел делает скачок вниз. Причина: фокус остался на странице. Что делать: кликнуть внутрь чёрного экрана — после этого ввод уходит в эмулятор.

Нет звука до первого клика. Симптом: картинка идёт, музыки нет. Причина: браузеры не дают странице включить звук, пока пользователь по ней не кликнул. Что делать: кликнуть по экрану игры; если звука нет и после этого, проверить, не выключен ли звук у самой вкладки.

Ни одна игра не запускается. Симптом: кнопка нажимается, но эмулятор не грузится ни в одной игре раздела. Причина: в сети или в браузере заблокирован WebAssembly — так настроены некоторые корпоративные и школьные сети и часть блокировщиков. Что делать: проверить в другом браузере или в другой сети; на нашей стороне это не чинится.

Игра идёт рывками на ноутбуке. Симптом: звук заикается, картинка дёргается. Причина: процессор вкладки занят другими вкладками или игра тяжелее машины. Что делать: закрыть лишние вкладки, включить полный экран, взять игру полегче.

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

С чего начать

Если раздел открыт впервые, разумный маршрут такой: DOOM — чтобы проверить, что всё работает и клавиатура ушла в игру; Dune II — чтобы посмотреть на игру с мышью; дальше по вкусу. Не знаете, что выбрать, — рандомайзер игр решит за вас, а разбор классики по жанрам лежит в гайде во что из DOS играть сегодня. Почему всё это вообще можно запускать бесплатно и легально, объяснено отдельно — в материале про модель shareware.

Вопросы и ответы

Нужно что-то скачивать или ставить эмулятор?

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

Почему первый запуск долгий, а второй мгновенный?

В первый раз браузер тянет сам эмулятор (около двух мегабайт) и архив игры — от одного до сорока мегабайт, размер написан на странице каждой игры. Дальше файлы лежат в хранилище браузера с именем js-dos-cache и берутся оттуда.

Сохранения переживут перезагрузку страницы?

В нашем плеере — нет. Файловая система эмулятора разворачивается в память вкладки, и после F5 игра собирается из архива заново. Сохраняйтесь внутри игры и проходите эпизод за один заход.

Это законно?

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

Игра не запускается вообще, кнопка нажимается впустую. Что это?

Чаще всего заблокирован WebAssembly: так настроены некоторые корпоративные и школьные сети и часть расширений-блокировщиков. Проверить просто — если ни одна игра в разделе не стартует, дело не в игре.

Источники

Попробуйте также