симуляция жизни a life
Уилл Поултер сыграет супергероя Адама Уорлока в фильме «Стражи Галактики 3»
Поиграть вместе не получится: PC-версия Monster Hunter Rise не будет поддерживать кроссплей с Nintendo Switch
Прогулка по миру игры: Первый полноценный геймплей перезапуска Saints Row
Внимание! Конкурс! Примите участие и получите FIFA 22 для PlayStation 5 в подарок!
Аниме (японская анимация)
No More Heroes: Travis Strikes Again
PR-менеджер студии GSC Game World Захар Бочаров побывал гостем на подкасте «Не занесли», в ходе которого ответил на несколько вопросов ведущих касаемо разработки S.T.A.L.K.E.R. 2.
Поскольку в настоящий момент по игре действует строгое NDA с GSC и Microsoft (соглашение о неразглашении), Бочаров оставил всё самое интересное без комментариев, но кое-что все же рассказал. Главное ниже.
«В первую очередь это игра, которую хотелось бы, чтобы покупали и перепроходили ради истории».
Дату релиза проекта по-прежнему не называют.
Добавляйтесь в наш Telegram-канал по этой ссылке или ищите его вручную в поиске по названию gmradost. Там мы публикуем то, что не попадает в новостную ленту. Также подписывайтесь на нас в Яндекс.Дзене. И не забывайте о том, что теперь у нас на сайте можно скрывать новости по категориям, переключаться между разными видами эмоций, использовать темную тему и отображать публикации лентой вместо плиток.
Подписывайтесь на наш Telegram канал, там мы публикуем то, что не попадает в новостную ленту, и следите за нами в сети:
Как создавалась система A-Life — перевод интервью с разработчиками NiGHTS Into Dreams
Это небольшое интервью, найденное на страницах журнала hihyou, рассказывает о механике «A-Life» из NiGHTS Into Dreams. Юдзи Нака делится достаточно ценными сведениями о том, через какие трудности его команде пришлось пройти при создании системы «искусственной жизни», а также своими мыслями о том, что индустрии нужно больше игр, подобных NiGHTS. Рекомендуется к прочтению в качестве дополнения к более масштабному интервью о разработке NiGHTS, переведённому ранее.
Юдзи Нака — Продюсер
Такаси Иидзука — Ведущий дизайнер
Тэтцу Катано — Программист
Нака: Я обожаю игры наподобие Lemmings и Populous. В последней удовольствие можно получать просто от того, как люди перемещаются на экране. Не могу смотреть без улыбки на то, как малюсенькие человечки вроде тех же Леммингов очаровательно снуют туда-сюда. Я хотел воплотить нечто подобное в Пианах (Nightopians или просто Pians — персонажи NiGHTS Into Dreams).
— Похоже, упомянутые вами игры и NiGHTS многое связывает.
Нака: Вообще, если начистоту, я собирался сделать симулятор A-Life куда более логически связанным с самой игрой, но тогда бы нам пришлось перестроить основной геймплей NiGHTS. Одно время я считал, что нам стоит просто выделить симулятор A-Life в отдельную игру. Мы поднимали этот вопрос, но в итоге сошлись на том, что вы можете увидеть в игре.
— Бьюсь об заклад, что, не будь системы A-Life, жизнь программистов была бы куда проще.
Катано: Да. (смеётся) Как вы можете представить, понадобилось много времени на то, чтобы всё отладить и настроить. У нас и без этого был крайне жёсткий график, и разработка A-Life отъела немалую часть времени, имевшегося в нашем распоряжении.
Нака: Генетическая эволюция внешности, формы и способностей Пианов целиком полагается на статистику, потому система не была отлажена сразу со старта, к тому же мы волновались о том, как бы со временем наружу не всплыли некоторые нежелательные последовательности, вроде постепенного коллапса всего многообразия видов Пианов в один единственный вид или становления всех их действий однотипными. Если мы отдадим предпочтение хотя бы одной генетической последовательности, то она создаст угрозу всей системе A-Life с риском развалить её до основания. Впрочем, по-моему, сбалансировали мы её в конечном итоге достаточно хорошо.
— Пианы получились очень милыми, с большим разнообразием их поведения.
Иидзука: Лично мне нравится заставлять Пианов выполнять новые для них действия даже больше, чем просто создавать их. И хотя технически мне следует знать все особенности и параметры системы A-Life, я не могу не приходить в восторг, когда вижу, что они делают нечто такое, чего я ещё не видел.
Нака: Создать Супер Пиана, кстати, куда проще, чем научить обычных чему-то новому. Впрочем, во время разработки игры мы повидали множество различных вариантов их поведения. Только возникают такие события не очень часто, если не сидеть дома за игрой беспробудно. (смеётся)
Катано: По правде говоря, мы немного подправили код игры и снизили частоту появления этих событий. (смеётся)
Иидзука: Ага, некоторые ситуации, связанные с Пианами, очень редкие. Например, у Найтс на уровне Frozen Bell во время секции с бобслеем могут появиться неожиданные оппоненты.
Нака: Серьезно? Ни разу такого не видел. И тебя не волновало, что они могут вызвать ДТП? (смеётся)
— А ещё вы разнообразили прыгучесть Пианов.
Нака: Среди них есть те, кто умеет прыгать очень высоко, а есть такие, кто парит с небольшим отрывом от земли.
Катано: Тех Пианов, у кого одновременно хорошо развит интеллект и прыгучесть, потом можно обнаружить на возвышенностях.
Иидзука: Я доволен тем, что в NiGHTS игрок сможет получить удовольствие самыми разными способами. Я буду на седьмом небе от счастья, если игроки настолько погрузятся в A-Life систему, что в итоге усвоят управление персонажем в совершенстве и с лёгкостью заработают высшие ранги на каждом уровне.
Нака: Мы изначально хотели сделать так, чтобы игроки могли давать имена отдельным Пианам. После нажатия на паузу появлялось бы окошко для ввода имени и последующего его изменения. Причём имена так или иначе бы проходили свой путь, подобно тем же генам, постепенно меняясь с каждым последующим поколением.
— Я думаю, это помогло бы ещё сильнее укрепить связь между игроками и Пианами.
Нака: К сожалению, исполнение этой идеи привело бы к недопустимо большому раздуванию файла сохранения, так что нормально поиграть в нашу игру смогли бы только люди с Backup RAM картриджем. Потому-то от неё и пришлось отказаться. Да и что нам мешает как-то иначе разнообразить Пианов или придумать ещё что-нибудь интересное с ними?
Катано: Её реализация всё равно превратила бы жизнь программистов в ад. (смеётся)
Нака: А пока мы хотя бы поняли, что систему наподобие A-Life всё-таки возможно не просто внедрить в игру, но и сделать её увлекательной. Сейчас я вижу своей целью то, чтобы развить эту идею в будущей игре.
— Из забавных особенностей, связанных с A-Life системой, я бы отметил ещё и то, что всякий раз, когда происходит что-то забавное, это ощущается как личное открытие, словно никто до тебя этого ещё не видел.
Нака: И это прекрасно — как раз именно то, что мы стремились воплотить.
— Наверное, в наши дни уже сложно добавлять в игру такой вот элемент «персонального» удовольствия, когда все играют, подглядывая в руководства по прохождению и копируя то, что там написано.
Нака: О такой «синергии» игроков и рынка руководств мы во время разработки игры даже не думали.
— Логично. И говоря о самой игре, вы, похоже, сделали особый акцент на грациозности полёта, а не скорости прохождения уровней.
Нака: Ага. Это часть нашего сообщения игрокам: NiGHTS отличается от прочих игр, выходивших ранее. Я уверен, что будут игроки, которые после нескольких тщетных попыток получить высший ранг за скоростное прохождение начнут задаваться вопросом о целесообразности быстрых перелётов. В общем, да, что система A-Life, что логика набора очков являются частями общего посыла игрокам, и те игроки, кто смогут его понять, получат от NiGHTS тонну удовольствия, а остальные, скорее всего, просто прекратят играть. Когда пробуешь что-то новое, приходится идти на уступки и жертвы. Такая уж дилемма.
— Да. Когда меняешь устоявшиеся правила, без сомнения найдутся те, кто принципиально не будет пробовать что-то новое.
Нака: В то же время существует немало игроков, кого утомили игры, построенные по одним и тем же лекалам. Именно для них мы попытались создать нечто новое. По правде говоря, если бы мы думали только о рисках, то нам следовало бы создать ролевую игру или файтинг («FTG game» в оригинальном тексте; возможно, я ошибся и неправильно расшифровал жанр — прим.пер.) Но поскольку игр в этих жанрах сейчас расплодилось очень много, люди, как мне кажется, начали уставать от них. И если продолжать создавать одни и те же игры, то вы в конечном итоге получите сообщество исключительно хардкорных игроков, а это не самое лучшее направление для игровой индустрии в целом. С помощью NiGHTS мы надеемся внести хотя бы небольшой вклад в её оживление.
— Тем не менее, благодаря наличию системы A-Life в игре появилась масса свободы в ключевых механиках и очень добротный геймплей.
Иидзука: Именно. Мы вбухали просто тьму времени на создание кор-механик NiGHTS — много, много часов. Чтобы отладить фундамент игрового процесса, мы проводили совещания за совещаниями, чтобы быть уверенными в том, что у нас появилась прочная и устойчивая основа.
— Круто ещё и то, что механиками A-Life можно насладиться, даже если уделять игре не более десяти минут в день. Проходя всего одну игровую ночь за раз, игрок через месяц сможет увидеть, как эволюционировал мир. Наблюдение за этими изменениями приносит огромное удовольствие.
Нака: Да, а ещё этот опыт у каждого игрока будет уникальным. То же самое можно сказать и про основной игровой процесс — только от вас зависит то, как вы будете получать от него удовольствие. NiGHTS привлекательна и проста в освоении, но, я думаю, при должном погружении в неё она сможет показать свою настоящую глубину.
С вероятностью 50% мы живем внутри симуляции: любопытная теория
Верите ли вы, что жизнь — это матрица? Если да, то новая работа профессора Колумбийского университета точно заставит вас тщательнее искать «сбои в системе».
В статье Бострома «Доказательство симуляции», которая считается главной работой в сфере «Гипотез симуляции», автор предлагают три следующих утверждения, из которых как минимум одно точно истинно:
Весьма вероятно, что человечество вымрет до того, как достигнет «постчеловеческой» фазы.
Каждая постчеловеческая цивилизация с крайне малой вероятностью будет запускать значительное число симуляций своей эволюционной истории.
Мы почти определенно живем в компьютерной симуляции.
Астроном Колумбийского университета Дэвид Киппинг внимательно изучил эти положения, которые известны как «трилемма Бострома», и доказал, что вероятность того, что мы действительно живем в симуляции, составляет 50%.
Свои расчеты Киппинг начал с того, что превратил трилемму в дилемму. Он связал первые две позиции вместе, так как в обоих случаях конечным результатом является отсутствие симуляции. Таким образом, дилемма противопоставляет физическую гипотезу (отсутствие симуляций) гипотезе симуляции. Так ученый присвоил моделям так называемую априорную вероятность, то есть вероятность, при которой отсутствует знание, поддерживающее наступление каждой из этих моделей. В таком случае каждая из теорий получает вероятность в 50%.
Следующий этап анализа требовал осмысления реальностей, которые могут порождать другие реальности и тех, которые не могут имитировать реальности потомства. Если бы физическая гипотеза (то есть та, в которой симуляции не существует) была верна, то вероятность того, что мы живем в бесплодной Вселенной, было бы легко вычислить: она составила бы 100%. Затем Киппинг показал, что даже в гипотезе симуляции большая часть моделируемых реальностей была бы бесплодной. Это происходит потому, что по мере того, как симуляции порождают новые реальности, вычислительные ресурсы, доступные каждому последующему поколению, сокращаются до такой степени, что подавляющее большинство будущих реальностей не смогут обладать вычислительной мощностью, необходимой для имитации последующих симуляций.
После сложных расчетов, астроном заключает, что вероятность того, что мы живем в симуляции, равна вероятности, что мы находимся в физическом мире. Но если люди когда-нибудь придумают такую «виртуальную реальность», эти расчеты радикально изменятся.
Цифровая жизнь или как сыграть в Бога на персональном компьютере
Вынесенный в заглавие отрывок, из увидевшего свет в 2001 году фантастического романа Питера Уоттса «Водоворот» не столь уж невероятен, как может показаться на первый взгляд. Пожалуй, он даже менее фантастичен, чем нейронные сети, что сегодня служат на благо человечества, сортируя картинки в интернете. Уже более пятидесяти лет специально отобранные программы-гладиаторы безжалостно сражаются между собой за жизненное пространство под беспристрастными взорами программистов.
Идея столкнуть два алгоритма в борьбе за выживание пришла в голову троим сотрудникам Bell Labs Виктору Высотскому, Роберту Моррису и Дугласу Макилрою. В 1961 году они разработали для IBM 7090, стоившего без малого 2,9 млн. долларов, компьютерную игру получившую название Darwin.
Загруженные в нее игроками программы вынуждены были конкурировать в изолированном участке компьютерной памяти и мешать выполнению друг друга заранее определенным правилам до тех пор по, пока копии одной из них не захватывали все отведенное для сражения пространство. Правда, «кровопролитие» продолжалось недолго. Всего спустя пару недель игры кончились. Возможно, потому, что дорогому оборудованию нашлось другое применение, а может быть дело в том, что один из участников соревнования написал программу, побороть которую на арене не удалось никому.
В 44 инструкциях содержался алгоритм, который с натяжкой можно назвать первой саморазвивающейся программой. С каждым следующим копированием часть инструкций тасовалась, в результате чего потомки действовали уже по несколько иному шаблону, причем в дальнейшем копировались только наиболее успешные представители вида. Это позволяло программе одинаково хорошо находить слабые места у любой угрозы, которую могли представлять программы-конкуренты.
К 1970 году внимание программистов переключилось на Game of Life — клеточный автомат созданный математиком Джоном Конвеем. Подробнее о нем на русском языке можно почитать здесь, а его работу проще всего увидеть, введя в Google запрос «Conway’s Game of Life». Возникавшие в нем структуры поразительно напоминали колонии простейших организмов, но наблюдать за ними было не многим интереснее, чем за чашкой Петри.
В 1984 идею Darwin подхватил вдохновленный кинокартиной «Трон», Александр Дьюдни. Созданная им игра Core War получился развлечением настолько дьявольски увлекательным, что в нее играют до сих пор.
По сути своей концепция цифровой арены изменилась мало: программы по-прежнему создавались игроками и выгружались в оперативную память, где боролись до последней рабочей инструкции. Однако здесь они были способны обмениваться кодом, встраивая друг другу разрушительные инструкции и переписывать в процессе свой код. Сражались в Core War и идейные наследники непобедимого алгоритма из Darwin, но добиться превосходства им было уже не так просто.
Первым понял, что человеческое вмешательство, только препятствовало развитию алгоритмов понял, работавший в Лос-Аломосе Стин Расмуссен. В его версии Core War был внедрен генетический алгоритм, но сама структура языка программирования, на котором работали внутриигровые гладиаторы, ограничивала возможности их развития и делала большинство мутаций фатальными для программ.
Изучая запущенную в моделируемый на его компьютере мирок цифровую фауну, Рэй наблюдал спонтанное возникновение паразитов и гиперпаразитов. Первые уменьшали свою длину за счет использования чужого кода, а вторые научились встраиваться в блоки памяти иных программ, для того, чтобы хозяин скопировал их вместе с собой.
Затем обнаружились и другие чудеса адаптации. Длина кода одного из самых успешных в борьбе за существование видов с начальных восьмидесяти байт сократилась до двадцати двух, при скорости копирования в шесть раз больше, чем у конкурентов. Возникли и более изощренные стратегии, — так, один из организмов, имевший размер в 23 байта, копировал при своем воспроизводстве еще один дополнительный байт и после 23 выполнений собирал из остатков дополнительную копию.
Публикация, описывавшая результаты моделирования произвела в научном сообществе фурор, а уже через 3 года появилась система «культивирования» компьютерного кода «Avida», которую вы можете установить прямо сейчас.
В отличие от предыдущих, эта система была ориентирована на получение практических результатов. В Avida выживаемость видов зависела не от их способности захватывать жизненное пространство и размножаться, а от того, насколько хорошо они совершали вычисления. Не важно, какие. Каждый раз, когда алгоритм учился совершать новые действия с числами — он получал конкурентное преимущество.
За двадцать с лишним лет своего существования в этой песочнице зародились многие тысячи различных цифровых организмов. Одни из них безошибочно воспроизводили последовательность Фибоначчи, другие блестяще проходили лабиринты, запоминая собственные шаги, третьи совершали арифметические операции эффективнее, чем это делали написанные людьми алгоритмы. Код некоторых цифровых организмов, несмотря на работоспособность так и не был расшифрован.
Самые эффективные и полезные из цифровых гладиаторов заслужили свободу и сейчас существуют на базе самых различных аппаратных платформ, таких, как например роботы пылесосы, а ведь изначально они не были способны ни на что, кроме как размножаться и мутировать.
Avida лишь один из множества доступных инструментов, с помощью которых можно завести у себя на компьютере цифровую жизнь и понаблюдать за ее развитием.
Простейшие симуляторы эволюции на примере колесных транспортных средств — boxcar2d и genetic cars 2 работают прямо в браузере.
Gene Pool в котором цифровые организмы соревнуются в способности плавать и находить пищу работает на Windows (и не только) без установки. Gene Pool представляет собой довольно увлекательное зрелище, однако в большинстве случаев за пару тройку часов реального времени в симуляции происходят массовые вымирания.
Critterding выполнен в полном 3D. В нем виртуальные существа обладают не просто базовым набором инстинктов, но полноценным усложняющимся со временем мозгом из десятка другого, а в дальнейшем и сотен нейронов.
Пока организмы не научатся управлять своими телами — динамики можно не ждать, а времени на это потребуется порядком, так что запаситесь терпением. Главный минус данной симуляции проистекает из ее статуса — с 2013 года она находится на стадии бета-версии, и ошибки в работе по прежнему время от времени встречаются.
Darwinbots – в отличие от предыдущего проекта очень динамичная песочница, в которой на первых же минутах работы можно наблюдать появление хищников.
При этом количество разнообразных настроек, предустановок и опций для виртуального мира просто зашкаливает.
Species: ArtificialLife, RealEvolution — пожалуй самый амбициозный из непрофессиональных симуляторов эволюции. Несмотря на внешнее сходство с проектом студии Maxis под названием Spore в отличие от последнего Species представляет собой скорее стратегию непрямого контроля, где игрок может влиять на симуляцию лишь опосредованно, изменяя настройки климата, ускоряя мутации, подкармливая или убивая аборигенов.
Появляющихся здесь тварей сложно описать, да и красотой они, как правило, не отличаются. Пожалуй, именно такое впечатление могла бы производить инопланетная жизнь. Отдельные элементы узнаваемы, но организм, который они образуют, совершенно сюрреалистичен.
Конечно, этими проектами список далеко не исчерпывается. Группа польских исследователей активно работает над симуляцией под названием framsticks (также доступна для загрузки и тестирования, но отличается запутанным интерфейсом). Еще один похожий проект — 3D Virtual Creature Evolution.
Из доступных в сети профессиональных систем машинного обучения следует выделить демонстрационную версию пакета webots, швейцарской фирмы Cyberbotics, с помощью которого проектировалась и тестировалась виртуальная модель робота AIBO, а также десятки моделей серий Lego Mindstorms, Khepera, Koala. В комплекте поставки есть роботы — модели искусственной жизни, а при знании Си или Java на их базе можно запрограммировать и собственные цифровые арены. Ограничение лишь одно, чтобы перенести представителя цифровой жизни в физическую модель необходимо за кругленькую сумму приобрести полную версию программы.
Чрезвычайно гибким симулятором сложных процессов — динамики социальных групп, поведения экономических агентов, природных явлений, годящимся, в том числе и для культивации цифровой жизни, является Cafun. Среди демонстрационных сценариев здесь имеются симуляции на любой вкус: от химических реакций, потоков частиц, распространения пожаров и до биологических объектов, например амеб или лесных массивов.
Будущее цифровой жизни, несмотря на колоссальный рост вычислительных мощностей и совершенствование виртуальных песочниц, судя по всему, лежит несколько в иной плоскости. Основной вектор разработок в этой области в последние годы сместился с имитации эволюционных процессов с нуля на разработку детальных цифровых копий многоклеточных биологических существ. Пока, простейших — червей-нематод. Однако, исследователи из Human Brain Project, объединившего из 135 научных центров в 26 странах Евросоюза уже нацелились к 2023 году воссоздать мозг человека со всеми 90 миллиардами нейронов вплоть до отдельных ионных каналов.
Может тогда и возникнет искусственный разум? В таком случае останется надеяться на то, что он не станет мстить за миллиарды примитивных предков, погибших в процессе экспериментов.
Как ускорить игру «Жизнь» в сто раз
Сложно найти человека, не знакомого с игрой «Жизнь», придуманной английским математиком Джоном Конвеем еще в 1970 году, и до сих пор не теряющей своей популярности. Многие программисты писали свою реализацию этой игры, и еще одна вряд ли кого-то удивит. Однако эта игра является отличным примером, показывающим, насколько полезной может оказаться оптимизация вычислений, даже не меняющая асимтотическую сложность алгоритма. Мы начнем с простейшей реализации на c# и будем последовательно применять различные оптимизации, ускоряя работу программы.
Мы также улучшим алгоритм на JavaScript, ускорив его в 10 раз по сравнению с неоптимизированной версией.
В конце статьи дана ссылка на код, а также на online-реализацию игры с оптимизированным алгоритмом на JavaScript, выполняющим до двухсот итераций в секунду на поле размера 1920×1080 (Full HD), где вы можете убить время поиграть в эту замечательную игру.
Правила игры
Игра «Жизнь» идет на плоскости, состоящей из клеток, каждая клетка имеет 8 соседей. Клетки могут быть «живые» или «мертвые». В каждой итерации (еще называемой «поколением») состояние поля меняется в зависимости от количества живых соседей: если рядом с живой клеткой два или три живых соседа, клетка выживает в следующем поколении. Если рядом с мертвой клеткой ровно три живых соседа, то в следующем поколении клетка «рождается».
— клетка A имеет одного живого соседа, поэтому она умирает;
— клетка B имеет трех живых соседей, поэтому она остается жить;
— клетка C имеет трех живых соседей, поэтому она рождается;
— клетка D имеет пять живых соседей, поэтому она остается мертвой.
Реализация на JavaScript не требует никаких зависимостей, хотя игру желательно запускать в браузере Chrome, поскольку в Microsoft Edge он работает крайне медленно. Разработка велась в Visual Studio Code.
Как устроен код на c#
Размер игрового поля зафиксирован как 1920×1080 (Full HD), причем крайние клетки всегда мертвые. Это не влияет на производительность, но упрощает алгоритмы, избавляя от проверок на граничные условия. Все алгоритмы наследуются от абстрактного класса LifeJourney, что позволяет унифицировать их тестирование:
Юнит-тесты запускают один и тот же набор тестов для каждого алгоритма:
Тестирование производительности создает поле случайной заливкой с использованием генератора случайных чисел с фиксированным seed-ом (так что каждый раз поле получается одним и тем же). После этого запускается цикл из тысячи итераций, и в конце замеряется время (в секундах), а также проверяется конечное состояние поля (количество выживших клеток и хеш-код) для дополнительной проверки корректности работы алгоритма:
1. Наивная реализация
Начнем с самой простой реализации: поле представлено массивом boolean, хранящим информацию о живых клетках; каждая итерация выполняется в два прохода:
2. Добавляем байты
В предыдущем алгоритме для каждой клетки выполняется 8 операций сравнения. Попробуем уменьшить их число:
— Вместо двумерного массива boolean создадим одномерный массив байт, в котором живая клетка представлена значением 1, а мертвая — 0.
— Вместо восьми проверок будем суммировать байты соседей текущей клетки, тогда их сумма и будет равна числу живых соседей.
— Во временный массив будем писать сумму клеток, отложив проверку на второй проход:
3. Добавляем восьмибайтные слова
Заметим, что при первом проходе для всех байт выполняются одни и те же восемь сложений, что
наводит на мысль вместо обработки одного байта сразу обрабатывать 8 байтов, так как для многих инструкций, работающих с байтом, на современных процессорах есть аналогичные инструкции, работающие с двух-, четырех- и восьмибайтными словами. В нашем случае сложение восьмибайитных слов будет давать такой же результат, что и восемь сложений соседних байт подряд:
Заметим, что это не всегда верно, так как если при арифметических операциях с байтами происходит переполнение, то аналогичные операции с длинными словами будут давать неправильный результат. Однако нам повезло, и максимальное значение, которое мы можем получить при сложении в байте, равно восьми, и переполнение у нас случиться не может.
Чтобы заменить операции над байтами операциями над восьмибайтными словами, нам надо воспользоваться доступной в c# арифметикой указателей:
— пометить класс как unsafe;
— получить указатели на оба массива;
— преобразовывать указатель на байт в указатель на ulong
Меряем производительность, и…
4. Добавляем поиск в таблице
Мы неплохо оптимизировали первый проход, однако во втором проходе на каждый байт выполняются несколько проверок, от чего мы хотим избавиться. Стандартная оптимизация в таких случаях — lookup table, когда результат для всех комбинаций входных данных вычисляется заранее и кладется в таблицу. Наши входные данные — текущее состояние клетки (один байт в оригинальном массиве) и количество соседей (один байт во временном массиве). Мы могли бы вычислить таблицу для всех комбинаций этих байт, что нам даст размер таблицы 16 килобайт, однако мы можем сократить размер таблицы, заодно упростив код. Идея состоит в том, что количество соседей от 0 до 8 не занимает целый байт, а умещается в младшие три бита (на самом деле, в четыре, но 8 соседей и 0 соседей дают одинаковый эффект, поэтому мы игнорируем четвертый бит в количестве соседей). Поэтому мы закодируем состояние текущей клетки в четвертом бите этого же байта, и наша таблица будет длиной 16 байт, из которых только три значения равны единице. Значения, равные единице, соответствуют индексам, кодирующим мертвую клетку с тремя соседами или живую клетку с двумя или тремя соседями:
В итоге получаем ускорение почти в два раза:
5. Добавляем битовую магию
На этот раз забудем предыдущую оптимизацию и заново оптимизируем второй шаг, чтобы не только избавиться от условных выражений, но, как и в первом шаге, вычислять по восемь клеток за раз. Нам надо, фактически, придумать битовую функцию, которая будет получать те же самые результаты, что и lookup table из предыдущего шага. Те, кто изучал булевую алгебру, знают, что для любой таблицы истинности (а наша lookup table именно ей и является) можно написать соответствующую булеву функцию, хотя она и может получиться сложной. Однако существует метод диаграммы Карно, позволяющий из таблицы истинности получить сильно оптимизированную булеву функцию простым и наглядным способом. Этот метод отлично применим и к нашей таблице; однако, учитывая, что в ней всего 16 входных значений, при некотором везении опыте можно подобрать нужную функцию перебором.
Опустим промежуточные выкладки и приведем:
В данном виде этот код не особо лучше поиска по таблице, поскольку делает слишком много операций на байт. Однако он позволяет перейти от побайтовых вычислений к обработке 8 байтов за раз:
Код стал совершенно непонятным, однако работает почти в два раза быстрее предыдущей версии:
6. Храним по две клетки на байт
Последняя оптимизация такого типа логично вытекает из предыдущих: до сих пор мы хранили по одной клетке на байт, обрабатывая по восемь байтов за один раз, но во всех вычислениях мы на самом деле оперировали только четырьмя младшими битами в байте, так как старшие четыре бита всегда были нули. Теперь мы будем хранить по две клетки на один байт: одну в младших четырех битах, другую — в старших. Временный массив, хранящий число соседей, также будет хранить количество соседей независимо в младших и в старших четырех битах. Выгода в том, что мы все равно будем обрабатывать по восемь байт за раз, но в этот раз в них будет не восемь, а уже шестнадцать клеток! Потенциально это может привести к более чем двукратному ускорению, так как, кроме уменьшения в два раза количества операций, мы также уменьшаем в два раза размер используемой памяти, что позволит лучше утилизировать кеш процессора.
В самом алгоритме при втором прогоне меняются только константы и границы итерирования, но при первом прогоне из-за упаковки по две клетки в байт приходится приходится применять логические сдвиги на 4 и 60 бит влево и вправо, что делает код более запутанным:
А вот реализация методов get и set усложняется. К счастью, эти методы практически не влияют на производительность, так что можно не слишком беспокоиться по этому поводу. Также обратите внимание на технический трюк: для корректной работы алгоритма пришлось добавить по одной пустой строчке в начало и в конец массива, чтобы избежать проверок на выход за границы массива.
7. Используем SIMD-инструкции процессора
Этот подход дает нам самую большую оптимизацию (в сто раз по сравнению с изначальным алгоритмом, так что название статьи — правда)!
Это все?
Для полноты картины надо упомянуть еще две оптимизации, которых мы не коснулись:
JavaScript
Наконец-то мы дошли до самого интересного: можно ли эти оптимизации перенести в JavaScript?
К сожалению, SIMD-версию использовать невозможно, поскольку AVX2 туда еще не завезли. Однако, как ни удивительно, предпоследнюю версию с битовой магией и упаковкой по две клетки в один байт вполне можно использовать, правда не восьмибайтный вариант, а только четырехбайтный.
Трюк здесь в том, что в JavaScript есть специальные классы, позволяющие работать с массивом байт одновременно и как с байтами, и как с числами: UInt8Array и UInt32Array. При этом можно перенести код практически дословно (с поправкой на обработку четырех байт вместо восьми) и надеяться, что JIT-компилятор яваскриптового движка сможет обработать нашу битовую арифметику без конвертации в числа с плавающей точкой.
В заключение сводная таблица со всеми алгоритмами:
Онлайн-игра
Напоследок самое интересное: на основе этого алгоритма была написана онлайн-игра, стабильно быстро работающая на поле размера 1920×1080 (Full HD) при любой начальной конфигурации: