2017-10-15

Об играх

В игры я почти не играю. Раньше играл. А сейчас почти не играю.
Нет, я, конечно, снова прошёл весь Carmageddon, когда он вышел под Android. И с удовольствием резался в Plague Inc.. И даже где-то у меня есть аккаунт в Steam, где пылится честно купленная на распродаже за нуль рублей Portal.
Carmageddon
Но я сейчас о другом. Я, оказывается, ни разу не задумывался, как делаются современные игры. А это прям отдельная Вселенная.
В студенческие годы, я, конечно, писал игрушки. Под DOS, на C и C++. Развлекался с трёхмерной графикой, освещением и текстурами в режиме 320х200 c 256 цветами. Трёхмерные крестики-нолики делал. А ещё в текстовом режиме были «Быки и коровы» и «Жизнь».
Чуть позже я немного развлекался с Borland C++ Builder (именно ещё от Borland). И наклепал для Windows тетрис (любой уважающий себя программист должен написать тетрис), решалку японских кроссвордов и даже симулятор MK-61 (ну как бы уже не совсем игра).
С тех пор игр не писал. А зачем? Какой от них толк? Интереснее сделать что-нибудь полезное. Для себя.
Ludum Dare
Но случайно таки оказался недавно на омском Ludum Dare. И там я узнал, что игры пишутся совсем не так, как пишутся обычные сетевые приложения, или как обычные гуёвые приложения.
Как работает обычный сервер? Он ждёт запросов. Пока запросов нет, он ничего не делает. Когда приходит запрос, он его обрабатывает. Запускает ли он для этого другой процесс, или другой поток, или всё делает в общем (для кучи соединений) потоке-воркере (то, что называется асинхронным) — не важно. Важно, что всегда есть запрос-ответ. Нет запроса — ничего не происходит (как правило).
Запросы создаёт клиент. Именно он является инициатором всего этого безобразия. Нет клиентов — нет запросов — ничего не происходит.
Аналогично в GUI. У нас есть события: движения мышки, нажатия кнопок и клавиш. Когда событие происходит, оно должно быть обработано. Графическим элементом, над которым оно произошло, окном и т.д. И тут, кстати, не придумали особо изящного способа обработки всех этих событий, кроме как одного, в одном потоке, бесконечного (но блокирующегося) цикла. Да, это тоже асинхронщина.
Пока вы двигаете мышкой из одного угла экрана в другой, происходят тысячи событий, в десятках разных приложений. Но если вы взялись ковырять в носу, и убрали руки с мыши и клавиатуры, то событий не будет. И снова ничего не будет происходить. Ну разве что курсор будет мигать. На старых терминалах мигание вообще делалось аппаратно.
Общее тут то, что пока нет события или запроса, ничего не делается. А когда события и запросы пошли, их все нужно успеть обработать. В современных GUI это не всегда тривиально. Но оно так и работает.
Java GUI Event Loop
В играх всё по-другому.
Даже роли клиента и сервера отличаются. Да, клиент по-прежнему подключается к серверу. Но дальше идут не запрос-ответ, а отправка сообщений. В обе стороны. Клиент сообщает о действиях игрока. Сервер сообщает о состоянии игры (изменённое действиями и этого, и других игроков). Существенное правило безопасности: сервер знает всё, а вот клиент должен знать только то, что ему положено знать. Нарушение этого правила порождает интересные возможности для тех, кого называют читерами (к примеру, в World of Tanks это вообще весело).
В играх игрок тоже жмёт кнопки и елозит мышкой. И это тоже может порождать события. Но эти события никого особо не интересуют. События не порождают немедленных действий по их обработке. Да, координата мышки, или номер нажатой кнопки могут быть где-то запомнены, чтобы знать, что кнопка нажималась. Но и всё.
Потому что в играх — постоянный polling. В бесконечных циклах. С задежкой. Это, конечно, не обязательно должны быть while (true) в отдельных потоках со sleep() внутри. Можно всё сделать хитрее, на таймерах и всё такое. Но сути дела это не меняет.
Есть цикл для отрисовки. Который даёт те самые fps. Тут всё просто. Берётся состояние игры, с точки зрения игрока. И отрисовывается. Столько раз в секунду, сколько надо. Само состояние может меняться реже или чаще.
Есть цикл опроса действий игрока. Тут как раз мы выясняем, какие кнопочки нажаты, где находится мышка. И, либо прямо модифицируем состояние игры, в случае сингл плеера. Либо передаём намерения игрока на сервер, в случае сетевого мультиплеера.
На сервере намерения игроков накапливаются. А потом происходит тик игры. Это самый главный цикл, где изменяется глобальное состояние игры. Раз и навсегда. Тут просчитываются всякие перемещения, уроны, жизни и т.п. И тут очень важным параметром является время, прошедшее с предыдущего тика. Как правило это время не может быть в точности постоянным. И это надо учитывать, дабы персонажи, как минимум, перемещались равномерно. И изменённое состояние игры рассылается всем игрокам.
Из-за ограничений в скорости сети, эти рассылки идут значительно реже, чем fps. Что порождает некоторые особенности. Все эти опросы, просчёты, отрисовки происходят каждый в своём цикле. И они в общем случае не синхронизированы. Нужны какие-то правила синхронизации.
Например, что делать, если игрок упорно движется в определённом направлении, а с сервера обновлённого состояния, где произошло перемещение в данном направлении, ещё не пришло? Клиент может взять на себя смелость и изменить местоположение игрока, чтобы при прорисовке перемещение происходило плавно. Это называется интерполяцией. Если прогнозы клиента, и обновлённое состояние с сервера совпали — всё хорошо. А вот если выяснится, что игрока по пути кто-то убил, придётся как-то выкручиваться и дорисовывать, что сначала мы дошли туда, а потом, метром ранее, умерли.
Пересылка сообщений. Циклы опроса. Асинхронная пересылка сообщений. Синхронизация состояний. Безопасность и доверие. Вот это вот всё — игры.
Может, я рассматриваю лишь частный случай игродельной индустрии. Но мы на Людуме клепали так.
Game Loop
Почему же классические клиент-серверные архитектуры, а так же GUI, построены по-другому? Дело в экономии ресурсов? Выгодно ничего не делать, пока нет событий? В играх ведь все циклы: отрисовки, опроса, просчёта следующего состояния игры — колбасят всегда, независимо от действия или бездействия игрока. CPU и сеть никто особо не жалеет.
С другой стороны, где-то циклы с постоянными опросами всё же встречаются? Уж не в ядрах ли ОС? Тот самый поллинг сетевой карты вместо прерываний. Нет? А в RTOS, случайно, не осуществляется такой же тотальный контроль над временем выполнения задач? Ну не успел выстрел игрока попасть в вычисления данного состояния игры, значит выстрела на данном шаге не будет.
Какая-то другая Вселенная — эти игры. Где бы это применить, не начиная писать игры? :)

2017-10-01

О сэре Максе из Ехо

Наконец-то дочитал «Лабиринты Ехо» и «Хроники Ехо». Думаю, теперь можно написать про Макса Фрая. Точнее про сэра Макса из Ехо. В надежде, что кто-нибудь тоже захочет прочитать эти прекрасные книги.
Ехо
Рукописи в издательство носили, конечно же, обычные люди: Светлана Мартынчик (ага, женщина) и Игорь Стёпин. Но автором значится некто Макс Фрай. Или Max Frei, если латиницей. Максимально свободный. Или без Макса. И вовсе никогда не Максим.
Вот Макс Фрай и пишет автобиографические очерки. О том, как он был сэром Максом в Ехо. И как туда попал. И как туда вернулся. Где его всегда называли только по имени. Что там ещё было с Максом Фраем кроме Ехо, этого я ещё не читал.
Порядок чтения очень важен. Это же Кастанеда для маленьких. Не прочтёте предыдущие книжки, не поймёте, на что ссылаются и объявляют ложным последующие книжки. Ну ладно, Макс Фрай ничто не объявляет ложным, чем запутывает и себя, и читателя ещё больше.
Сначала «Лабиринты Ехо», потом «Хроники Ехо», потом, видимо, «Сновидения Ехо». За точным порядком можете консультироваться у Википедии. Кстати, последние книжки «Сновидений Ехо» вышли в этом (2017) году, так что история продолжается.
Жанр? Определённо фэнтэзи. Или как там называется это всё, с волшебством, эльфами (хотя тут эльфы весьма странные) и всем прочим? Определённо детектив. Потому что почти всегда имеется преступление и расследование. А ещё мистика, ужасы, комедия, мелодрама. Да всё, что угодно. Поэтому я нарекаю жанр историй сэра Макса из Ехо «сериалом».
Это действительно сериал. Длинный и увлекательный. С громадным количеством длинных нескучных диалогов. С несильно большим количеством действия. Впрочем, после каждого действия офигевать приходится и читателям, и сэру Максу. Сэра Макса мог бы сыграть, к примеру, Егор Бероев. А вот сэра Джуффина Халли конечно же должен бы играть Рутгер Хауэр, как он выглядел, к примеру, в «Десятом королевстве».
Карта Мира
Слово «Ехо» надо читать именно как «Е́хо», а не «Ёхо» или «Эхо». Ехо — это столица Соединённого Королевства, крупнейшего государства, расположенного на материке Хонхона в Мире Стержня. Ехо построен вокруг Сердца Мира. Сердце Мира — это то место, где выходит один из концов Стержня, на котором и держится этот Мир.
У Сердца Мира отлично работает Очевидная (или бытовая) магия, и чёрная, и белая. Именно потому Ехо построили здесь. Чтобы магистрам многочисленных магических орденов было веселее сражаться друг с другом. Впрочем, оказалось, что злоупотребления Очевидной магией разрушают основу Мира. В результате, ради спасения Мира, все магические ордены были упразднены или побеждены, а у власти Соединённого Королевства остались, собственно, король, Гури́г VII, а также Орден Семилистника, Благостный и Единственный. Впрочем, это всё произошло более чем за сто лет до описываемых событий.
Зато, помимо Очевидной есть ещё и Истинная магия. В которой большинство героев вполне сведущи и более уважают. А ещё есть... А фиг его знает, что там ещё есть.
Макс попал в Ехо, то есть в Мир Стержня, из Мира Паука. По указанию Джу́ффина Ха́лли он сел на трамвай на улице, где трамваи отродясь не ходили. Это самая первая версия появления сэра Макса в Ехо. Есть ещё и другие. Более мистичные, прагматичные и циничные. Но все они вполне истинны. Ибо иначе и быть не может.
Трамвай между мирами
Мир Паука — это наш с вами мир, дорогие читатели. Паука, потому что мы, как пауки, любим оплетать окружающую действительность «паутиной», привязывая к себе вещи и людей. И привязываясь к ним сами.
А ещё в нашем мире дофига Вершителей. Вершитель — это существо, чьи желания исполняются всегда, рано или поздно, так или иначе.
Вы никогда за собой не ощущали, что вы — Вершитель? А не замечали Вершителей вокруг? Не забывайте про «рано или поздно, так или иначе», что повышает пикантность ситуации. Так что Вершители — вовсе не счастливые или удачливые люди. А теперь представьте, что Вершителей набралось миллиарды. Как в нашем мире. Бардак вполне ожидаем, не так ли?
А вот в Мире Стержня последним Вершителем был легендарный король Мёнин. И очень понадобился ещё один. И им стал сэр Макс. От короля Мёнина сэр Макс натерпелся немало шуточек (или серьёзностей) сомнительной доброты. Даже как-то таскал в собственной груди его меч, дада, воткнутый насквозь.
Кроме Мира Стержня и Мира Паука существует бесчисленное множество других миров. И одно из призваний практикующего Истинную магию (а также почти всех призраков) — путешествовать между мирами. Или по Тёмной стороне Мира. Или по Изнанке Тёмной стороны. Или по Сновидениям. Настоящий колдун всегда найдёт, где поразвлечься.
А некоторые, особо сильные колдуны, вполне могут создавать новые миры, или разрушать целые миры. Сэр Макс, кстати, между делом создал несколько миров в самом начале своих приключений. За что потом понадобилось нести ответственность.
Итак.
Игрушечный Макс
Сэр Макс. Ночное Лицо Почтеннейшего Начальника Малого Тайного Сыскного Войска города Ехо. Сидит по ночам в кабинете сэра Джуффина, на всякий случай, замещает. Смерть на королевской службе, носит Мантию Смерти. Ибо может плеваться ядом. Владыка Фангахра, властитель народа Хенха из Пустых Земель. Оказался в центре политических игр, в результате которых Пустые Земли присоединились к Соединённому Королевству. Вершитель. Его Смертный Шар не убивает, а подчиняет. Человек Тёмной Стороны. Сновидец. Может творить множество самых удивительных чудес, но сам не понимает, как это у него получается. Балагур, душа компании.
Джуффин
Сэр Джу́ффин Ха́лли. Почтеннейший Начальник Малого Тайного Сыскного Войска города Ехо. В прошлом Кеттари́йский Охотник, Кеттари́ец, Чи́ффа, известный и опытный наёмный убийца. Старый опытный колдун, специализирующийся на Истинной магии, и радеющий о судьбе Мира. Человек Тёмной Стороны. Сновидец. Основал Тайный Сыск, дабы творить всякие магические непотребства, когда всем остальным это запрещено Кодексом Хре́мбера. Начальник и учитель сэра Макса.
Мелифаро
Сэр Мелифа́ро. Дневное Лицо Почтеннейшего Начальника Малого Тайного Сыскного Войска города Ехо, то есть заместитель сэра Джуффина в дневное время. Страж (границы Тёмной стороны). Лучший сыщик, применяет дедуктивные и прочие методы, как и положено детективу. Сын автора «Энциклопедии Мира» сэра Ма́нги Мелифа́ро. Не имеет имени, ибо, когда он родился, отец как раз путешествовал, собирал материал для экциклопедии, и не нашёл времени выбрать сыну хоть какое-нибудь имя. Модник. Балагур. Постоянный оппонент сэра Макса в колкостях и остротах.
Шурф Лонли-Локли
Сэр Шу́рф Ло́нли-Ло́кли. Мастер Пресекающий Ненужные Жизни, штатный убийца Тайного Сыска. Владеет Перчатками Смерти, ими, собственно, и убивает, когда нужно. Человек Тёмной Стороны. В прошлом Безумный Рыбник, известный исторический персонаж конца Эпохи Орденов. Состоял в Ордене Дырявой Чаши, в результате имеет привилегию пить из дырявой посуды, и это у него прекрасно получается. В силу необходимости вынужден быть Истиной, точно соблюдать правила и предписания и требовать подобное от других. Невозмутимый педант. Любитель и знаток поэзии и литературы. Лучший друг сэра Макса, вместе они попадали в совершенно странные истории и неоднократно спасали жизнь друг другу.
Меламори
Леди Меламо́ри Бли́мм. Мастер Преследования Затаившихся и Бегущих. Встаёт на их след, и никуда они не денутся, леди притащит их в Тайный Сыск, как бы они ни сопротивлялись. Первая (и долгое время единственная) леди Тайного Сыска. Первая и последняя девушка сэра Макса в Ехо. Уезжала на далёкий и таинственный материк Арваро́х. Вернулась весьма необычным для уроженки Угула́нда способом: превратилась в буривуха и прилетела. Что свидетельствует о недюженном таланте к фиг знает какому виду магии.
Кофа Йох
Сэр Ко́фа Йо́х. Мастер Слышащий. Или Кушающий-Слушающий, по едкому замечанию сэра Мелифаро. Меняет внешность (кардинально, магическим образом) и шляется по трактирам Ехо, узнавая все свежие слухи. Старый и опытный колдун, специалист в Очевидной магии. На Тёмную сторону попасть не может. Снов не видит. В прошлом — Генерал Полиции Правого Берега. Гонялся в те времена за Кеттарийским Охотником, пару раз даже почти поймал. Сын Хумхи Йоха, одного из семи легендарных «Отцов Основателей» Ордена Семилистника.
Сэр Нуммино́рих Ку́та. Штатный Нюхач Тайного Сыска. Очень чутко различает запахи. По запаху может сказать, где бывал и чем питался человек последние несколько дней. Талантливый сновидец. Ученик сэра Макса.
Теххи
Леди Теххи Шекк. Девушка сэра Макса, между леди Меламори и леди Меламори. Дочка Лойсо Пондохвы, в результате — не вполне человек, а скорее сильное наваждение. Зеркало, подстраивается под собеседника, чем вызывает неодолимую симпатию.
Лойсо Пондохва
Ло́йсо Пондо́хва. Основатель и Великий Магистр Ордена Водяной Вороны. Один из величайших колдунов своего времени. Тяготеет к разрушениям, в результате стал героем многочисленных поговорок вроде: «Сам Лойсо Пондохва ногу сломает». Его именем пугают маленьких детей. Стёр с лица земли родной город сэра Джуффина Халли Кетта́ри. Был пойман Джуффином Халли (ещё Кеттарийским Охотником), при содействии Шурфа Лонли-Локли (ещё немного Безумным Рыбником). Был освобождён сэром Максом. Был спасён сэром Максом от жажды разрушений. Друг и тайный собеседник сэра Макса.
Ну вы поняли. Куча новых слов, географических названий, странных имён. С фиг поймёшь какими ударениями. Много магии. Разной магии. Странной магии. Много разных чудес, разной степени чудесатости. А главное, почти на каждой странице найдётся настолько милая фразочка, что уже устаёшь дёргать их на цитаты.
Пока писал всё это, глянул, о чём там «Сновидения Ехо». Да, это продолжение. Сэр Макс снова возвращается в Ехо.
Как будто прочитать как будто волшебным несуществующим увидительным пережитые написанные изданные как будто о настоящем волшебном многозначном удивительном как будто радостные и полезные узнать и полюбить.
Мелифаро и Шурф