Pier-Luc Brault придумал забавную игру, которая превращает вас в... операционную систему. Некий пользователь загружает нас процессами, которые нужно распределять по свободным CPU. Если мы будем плохо справляться с задачей, пользователь выйдет из себя и перезагрузит нас. Game over.
![Интерфейс игры Интерфейс игры](https://habrastorage.org/getpro/habr/upload_files/d6f/ea2/ed4/d6fea2ed4ebc263c2f1a4400a3b24bb5.png)
Идеей игры Pier-Luc Brault сначала поделился со своим другом-компьютерщиком Сэмом в письме:
“Представь себе игру, в которой ты — операционная система. Тебе нужно управлять ядрами ЦП, процессами, подкачкой страниц и разделом подкачки. Ты должен следить за тем, чтобы ни один процесс не оставался без необходимых ресурсов, и заниматься подкачкой страниц, когда это необходимо. Цель игры — не довести пользователя до белого каления из-за того, что всё тормозит. Что скажешь?”
На что друг ответил:
"Скажу, что ты редкостный задрот!"
Так Pier-Luc Brault и приступил к разработке задротской игры. Сначала пришлось выбрать технологию. Проект был слишком скромный, чтобы ради этого изучать полноценный игровой движок, поэтому решено было использовать простую 2D библиотеку. Кроме того Пьеру-Люку хотелось вернуться к программированию на Python. Так что выбор был очевиден — Pygame. Кроме того, Pygame имел дополнительное преимущество: возможность компиляции игры в WebAssembly (с использованием pygbag), что позволяет играть в браузере.
На создание игры ушло около недели чистого времени, размазанного по восьми месяцам.
Игровая механика
В основе игры — процессы и ЦП. Вы можете нажать на неактивный процесс, чтобы назначить для него доступный ЦП, или кликнуть по активному процессу, чтобы удалить его из ЦП. Со временем неактивные процессы проходят через шесть уровней «голода» (нехватки ресурсов), представленных в виде смайликов на фоне разного цвета. Если процесс надолго задержался на последнем уровне «голода», пользователь теряет терпение и завершает его.
![Стадии "голода" Стадии "голода"](https://habrastorage.org/getpro/habr/upload_files/fe5/625/510/fe56255103781b65fcb5e0cd7a3a2e89.png)
Если пользователю приходится завершить 10 подобных процессов, он выходит из себя и перезагружает вас — операционную систему. На этом игра заканчивается. Цель — продержаться как можно дольше, не допуская перезагрузки. Это означает, что каждый процесс должен провести достаточно времени на ЦП, чтобы не опуститься на нижний уровень «голода».
Иногда на активном процессе в ЦП вы можете увидеть символ песочных часов. Это значит, что процесс на паузе, так как он ожидает события ввода‑вывода. Приостановленные процессы тратят время ЦП, поэтому их лучше оттуда удалять. Чтобы убрать паузу, нужно обработать события ввода‑вывода. Это делается щелчком по кнопке событий ввода‑вывода I/O events(), которая меняет цвет, если такие события появляются.
![Кнопка событий ввода-вывода Кнопка событий ввода-вывода](https://habrastorage.org/getpro/habr/upload_files/da9/ca9/874/da9ca98740c572ebb8eb1d1008b99ebe.png)
По мере развития игры появляется всё больше процессов, и играть становится всё сложнее. Каждый процесс создаёт страницы памяти. Белые страницы — те, которые используются, а серые — которые не используются. В какой-то момент процессы начинают занимать больше памяти, чем есть в ОЗУ, поэтому нужно начать перемещать их на диск.
Если активный процесс пытается получить доступ к страницам, которые находятся на диске, процесс и сами страницы начинают мигать. Это значит, что нужно переместить эти страницы в ОЗУ. Пока вы этого не сделаете, процесс будет приостановлен.
![](https://habrastorage.org/getpro/habr/upload_files/a5d/315/461/a5d315461ba5b6250c26fb87fe596287.png)
Если процесс остаётся приостановленным слишком надолго, он будет опускаться всё ниже по стадиям «голода» и в конечном итоге будет завершён недовольным пользователем.
Наконец, в игре предусмотрены разные уровни сложности, которые влияют на количество ЦП, объем ОЗУ, количество процессов при запуске игры, вероятность событий ввода‑вывода и т. д. Также есть режим настройки, где все эти параметры можно настроить отдельно.
Поиграть в браузерную версию можно на сайте.
Есть ли у игра образовательная ценность?
В первую очередь игра создавалась для развлечения, так что основной акцент сделан на играбельность и интерес, а не на реализм. Как минимум, игрок не может действовать со скоростью реального компьютера. Но есть и другие моменты, которые не соответствуют действительности. Например, процессы в игре используют ГОРАЗДО МЕНЬШЕ страниц памяти, чем реальные процессы. Ну и, конечно, реальный пользователь компьютера обычно не запускает новые процессы бесконечно. Это всего лишь игровой механизм, призванный делать игру всё сложнее.
Другими словами, игра не создавалась под образовательные цели. Однако она может иметь некоторую ценность для знакомства с принципами работы операционных систем, такими как планирование процессов и обмен памятью. С помощью игры легко наглядно показать, что на самом деле даёт наличие большего числа ядер у процессора или что происходит, когда заканчивается ОЗУ.
Конечно, при этом следует понимать, что работа ОС показывается очень условно.
Компиляция в WebAssembly
Компиляция игры в WebAssembly оказалась проще, чем ожидалось, благодаря доступной документации. Основные шаги: установить pygbag и внести изменения в код. Всё это описано в документации. Самой большой проблемой оказалась библиотека, использованная для отображения смайликов, которая не захотела работать с pygbag. В итоге пришлось просто скачать файлы SVG с OpenMoji и использовать GIMP для изменения их размера и экспорта в PNG.
По умолчанию игра подстраивает свой размер под размер окна браузера, сохраняя то же соотношение, что и версия для настольного компьютера. Если размер окна настольной версии меньше, то игра растягивается. При этом внешний вид интерфейса не особо страдает.
Кстати, исходный код игры доступен на GitHub. Попробуете?