The game of life обзор

Обновлено: 01.07.2024

Поскольку "В отличие от Gamedev-подсайта здесь может быть всякое: строгих правил нет". Напишу в стиле акын.

Для начала вступление о том, что делаю с картинками.

Дальше оттачивал навыки на шутере - Cardboard Maze. Он уже просто для компьютера, не для VR. Оптимизации там еще нет, не умел и не понимал, но работает стабильно. Желательно карточку не хуже 1060.

Делал в спешке, чтобы потом успеть поехать на DevGamm в Минск, вот геймплей:

А скачать и побегать можно вот здесь:

По ходу разработки научился в оптимизацию:

И вообще научился многому. Подзнакомился с парнями из Англии, которые несколько лет вели подкаст ZedRadio, в котором как будто зомби апокалипсис уже наступил, и они вещают оставшимся выжившим. Подкаст юмористичный и не политкорректный. ВСЕ их записи разрешили использовать в игре, будут отобраны лучшие и добавлены в игру в виде радио, которое можно выключить.

Собирал всё на ассетах, сильно их модифицируя для Oculus Quest:

Политика Окулуса для публикации в их Quest Store интересная. Опубликоваться самостоятельно в сторе нельзя. Вообще. Желающих очень много, шлак пропускать не хотят. Для этого была создана "песочница" - Applab. Модерация там сильно слабее, но техническую часть проверяет робот, среди требований есть, например, чтобы игра запускалась не более 5 секунд, чтобы за 45 минут непрерывной игры температура гарнитуры не поднималась до тротлинга, и всякое такое, помимо стабильного FPS.

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

Проверка для публикации в этой песочнице в единичных случаях занимает до 40 дней - желающих много.

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

В защиту окулуса скажу, что про разработчиков они не забывают, общаясь с ними получил БЕСПЛАТНО уже пять шлемов VR (скорее всего, потому что указал, что работаю один, а так присылают по количеству человек в команде) - два RiftS, Go, Quest, Quest 2. Правда для Quest 2 нужно было победить в их джеме. Также выдают членство в разных организациях, лицензию на Unity (мне правда не надо) и вообще общаются .

Йося встречает подарки от Окулуса. Он же символ студии. BulletHead Games

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

А теперь к грустному - третьего дня узнал, что от коронавируса скончался легендарный математик Джон Конвей — который, собственно, и описал правила своей Game Of Life (знаменит он не только этим, разумеется). Кто не знает что это - можно посмотреть вот здесь, в первой части видео:

Добавил эту самую игру, воссозданную через материал в Unreal Engine на один из мониторов, о чем, собственно и первое видео.

Правила построения этих зеленых пикселей следующие:

  • Игра «Жизнь» происходит на клеточном поле, которое, традиционно, называется «вселенная».
  • Каждая клетка может быть живой или мёртвой.
  • Поколения сменяются синхронно по простым правилам:
  • в пустой (мёртвой) клетке, рядом с которой ровно три живые клетки, зарождается жизнь;
  • если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае (если соседей меньше двух или больше трёх) клетка умирает («от одиночества» или «от перенаселённости»).

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

Всем успехов и не болейте! Если кому интерересно пообщаться - найти меня можно здесь, а также в VK. Очень интересно пообщаться (и посотрудничать), с теми, кто умеет в PR и написание сценариев.

Недавняя статья на Хабре в очередной раз показала неостывающий интерес к игре «Жизнь» в частности и всевозможным оптимизациям в общем. Статья и комментарии к ней, особенно любопытство к вычислениям на GPU, вдохновили меня на то, чтобы поделиться своими изысканиями на данном поприще и, забегая вперёд, скажу, что повествование пойдёт о расчётах на GPU, битовой магии, многопоточности и огромных полях для игры «Жизнь», порядка миллиарда клеток.

О себе

Пару слов о себе и проекте. Вот уже несколько лет моим хобби и pet-проектом является написание игры «Жизнь», в ходе которого я разбираюсь в интересующих меня темах. Так, сперва я сделал её с помощью библиотеки glut и прикрутил многопользовательский режим, будучи вдохновлённым архитектурой peer-to-peer. А около двух лет назад решил начать всё с нуля, используя Qt и вычисления на GPU.

Масштабы

Идея нового проекта заключалась в том, чтобы сделать кроссплатформенное приложение, в первую очередь для мобильных устройств, в котором пользователи смогут окунуться в игру «Жизнь», познакомиться с разнообразием всевозможных паттернов, наблюдать за причудливыми формами и комбинациями этой игры, выбрав скорость от 1 до 100 мс на шаг и задав размер игрового поля вплоть до 32'768 x 32'768, то есть 1'073'741'824 клетки.

На всякий случай напомню об игре «Жизнь». Игра происходит на плоскости, поделённой на множество клеток. Клетки квадратные, соответственно, для каждой клетки есть 8 соседей. Каждая клетка может быть либо живой, либо мёртвой, то есть пустой. В рамках игры пользователь заполняет клетки жизнью, выставляя на поле заинтересовавшие его комбинации клеток — паттерны.

Далее процесс шаг за шагом развивается по заданным правилам:

  • в пустой клетке, рядом с которой ровно 3 живые клетки, зарождается жизнь
  • если у живой клетки есть 2 или 3 живых соседки, то эта клетка продолжает жить
  • если у живой клетки меньше 2 или больше 3 живых соседки, клетка умирает

В моей реализации поле зациклено, то есть после 32'767-й клетки вновь следует 0-я. Таким образом, перемещающиеся паттерны способны обогнуть поле и оказаться в точке, где они были размещены изначально. Забавный эффект случается с паттерном «планёрное ружьё», когда выпущенные им планёры в конечном итоге врезаются в само ружьё и разрушают его, этакое самоубийство в мире клеточных автоматов:

Архитектура

Что касается реализации, то в первую очередь хочется отметить, что каждая клетка в игровом поле представляет собой всего лишь 1 бит в памяти. Так, при выборе размера игрового поля в памяти выделяется буфер размером n^2 / 8 байт. Это улучшает локальность данных и снижает объём потребляемой памяти, а главное позволяет применить ещё более хитроумные оптимизации, о которых поговорим ниже. Игровое поле всегда квадратное и его сторона всегда степени 2, в частности затем, чтобы без остатка осуществлять деление на 8.

Архитектурно выделяются два слоя, ответственные за вычисления:

  • низкий уровень — платформозависимый; на текущий момент существует реализация на Metal API — графическое API от Apple позволяет задействовать GPU на устройствах от Apple, а также fallback-реализация на CPU. Одно время существовала версия на OpenCL. Планируется реализация на Vulkan API для запуска на Android
  • высокий уровень — кроссплатформенный; по сути класс-шаблонный метод, делегирующий реализацию нужных методов на низкий уровень

Низкий уровень

Задача низкого уровня заключается непосредственно в расчёте состояния игрового поля и устроена следующим образом. В памяти хранятся два буфера n^2 / 8 байт. Первый буфер служит как input — текущее состояние игрового поля. Второй буфер — как output, в который записывается новое состояние игрового поля в процессе расчётов. По завершении вычислений достаточно сделать swap буферов и следующий шаг игры готов. Такая архитектура позволяет распараллелить расчёты в силу константности input. Дело в том, что каждый поток может независимо обрабатывать клетки игрового поля.

За счёт многопоточности GPU-подход добивается максимальной эффективности. На CPU также происходит распараллеливание, но, соответственно, с гораздо меньшим числом потоков и меньшей эффективностью, что отражено в секции бенчмарков ниже. Сам алгоритм идентичен для всех реализаций и заключается в следующем.

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


А участок игрового поля с интересующим нас байтом и его восемью соседними байтами изобразим так:


Исходя из рисунка, можно догадаться, что все соседние клетки можно уложить в один uint64_t (назовём его neighbours), а ещё в одном uint8_t (назовём его self), будет храниться информация о соседях в самом обрабатываемом байте.

Рассмотрим на примере расчёт 0-го бита целевого байта. Звёздочкой отметим интересующий бит, а нулём соседние для него биты:


Пример посложнее. Здесь звёздочкой отмечены 0-й, 3-й и 7-й биты целевого байта и соответствующими числами соседние биты:


Думаю, кто-то из читателей уже догадался, в чём заключается магия. Имея указанную информацию, остаётся лишь составить битовые маски для каждого бита целевого байта и применить их к neighbours и self соответственно. Результатом станут 2 значения, сумма единичных бит которых будет характеризовать число соседей, что можно интерпретировать как правила игры «Жизнь»: 2 или 3 бита для поддержания жизни в живой клетке и 3 бита для зарождения новой жизни в пустой клетке. В противном случае клетка остаётся/становится пустой.

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

После заполнения всего выходного буфера игровое поле считается рассчитанным.

Высокий уровень

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

Отрисовка клеток выполняется средствами Qt, а именно посредством заполнения пикселей в QImage. Интерфейс выполнен в QML. Пиксели заполняются лишь для небольшой области видимого игроку игрового поля. Таким образом удаётся избежать лишних затрат ресурсов на отрисовку.

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

Бенчмарки

Результаты замеров скорости работы игры для разных машин в зависимости от размеров игрового поля приведены в таблицах. Полученные значения в таблицах указаны в миллисекундах. При проведении тестов игровое поле заполнялось жизнью на 50% с помощью генератора случайных чисел.

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

Processor 2,6 GHz Dual-Core Intel Core i5
Memory 8 GB 1600 MHz DDR3
Graphics Intel Iris 1536 MB
GPU реализация
1024 2048 4096 8192 16384 32768
Низкий уровень (min) 0 0 2 9 43 170
Высокий уровень (min) 0 0 0 1 12 55
100 шагов 293 446 1271 2700 8603 54287
Время на шаг (avg) 3 4 13 27 86 542
CPU реализация
1024 2048 4096 8192 16384 32768
Низкий уровень (min) 3 25 117 552 2077 21388
Высокий уровень (min) 0 0 0 1 4 51
100 шагов 944 3894 15217 65149 231260 -
Время на шаг (avg) 9 39 152 651 2312 -
Processor 2.8 GHz Intel Core i7
Memory 16 GB 2133 MHz LPDDR3
Graphics Intel HD Graphics 630 1536 MB
GPU реализация
1024 2048 4096 8192 16384 32768
Низкий уровень (min) 0 0 0 2 8 38
Высокий уровень (min) 0 0 0 0 3 13
100 шагов 35 67 163 450 1451 5886
Время на шаг (avg) 0 1 2 5 15 59
CPU реализация
1024 2048 4096 8192 16384 32768
Низкий уровень (min) 1 7 33 136 699 2475
Высокий уровень (min) 0 0 0 0 3 18
100 шагов 434 1283 4262 18377 79656 264711
Время на шаг (avg) 4 13 43 184 797 2647

Видно, что на стареньком макбуке процессор совсем не справляется с огромным игровым полем и приложение становится неюзабельным. Даже процессор нового макбука едва вытягивает такой объём вычислений. Зато видеокарта значительно превосходит по производительности процессор как на старом, так и на новом железе. С использованием GPU новый макбук предлагает вполне комфортный пользовательский опыт даже на огромных игровых пространствах.

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

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

В будущем хочется провести бенчмарки на мобильных устройствах. Проект находится на ранней стадии разработки, а потому Apple-Developer аккаунта для проведения таких тестов сейчас у меня нет.

Спасибо за внимание! Буду рад любым комментариям к статье и к проекту:
Код на GitHub.

«Game Of Life 2» – игра в жизнь, часть вторая

Создателем игры по лицензии Hasbro является Marmalade Game Studio, которая ранее выпустила «Monopoly» и другие части «The Game Of Life» и другие игры на iOS по той же лицензии. И сделали они это на совесть..

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


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

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


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

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


Этого можно добиться двумя способами: зарабатывая деньги, получая зарплаты, побеждая в конкурсах и так далее; либо же получать атрибуты(романтика, богатство и интеллект). И благодаря этому можно стать бедным, но счастливым, либо богатым, но без эмоционального и интеллектуального багажа за плечами.

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


«The Game Of Life 2» очень увлекательна и вам будет сложно предугадать исход партии. Я поучаствовал в множестве партий очень часто побеждал даже тогда, когда у меня не было много денег, но я лидировал в атрибутах и волшебным образом выходил вперёд.

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

А вообще грустно смотреть на экран завершения игры, когда в «The Game Of Life 2» определяют победителя, ведь так или иначе они дошли до финиша и гробовой доски. И это интересная параллель: ведь кто-то будет выбрасывать числа 6-10 и идти к концу быстрее, пропуская все самое интересное, а кто-то будет часто выбрасывать 1-5 и будет наслаждаться каждым моментом прожитой «игры в жизнь». Но сама игра жуть как хороша и красива. Жаль, что на русский не переведена, но при этом она понятна интуитивно благодаря символам. Попробуйте, и возможно, она вам тоже понравится!

А еще у нас есть канал Telegram. Там также очень удобно следить за новостями на app-s.

Where will your choices take you? Find out in THE GAME OF LIFE!

THE GAME OF LIFE! showcases a beautifully rendered digital game board, cards and spinner that capture the fun of the Classic game full of adventure & surprises! THE GAME OF LIFE will take players on a journey where fortunes can be won…and lost! Choose a college or career path and start down the many roads of life, make money, buy a house or start a family -- will you take the safe route or the risky road? The choice is yours as you navigate life’s rich tapestry! Do whatever it takes to retire in style with the most wealth at the end of the game to win!

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