Искусственный интеллект: что дальше?

Машинное обучение (а конкретно сейчас глубокие генеративные нейросети) – это стильно, модно, молодёжно. Не, ну а что? Описал буковками то, что хочешь получить – и вот ты уже новый художник-реалист, импрессионист, модернист, авангардист и прочая, и прочая. А если к этому ещё приплести волну популярности NFT, то вот он – рай для креативщиков, ставящих основной целью искусства денежные знаки. Уже и про профессию подходящую поговаривают. Так что совсем скоро в каком-нибудь мемасике можно будет прочитать: «Ты чё, пёс, я не бездарь, я prompt-инженер».

Я и сам решил немного поиграться c MidJourney. Отчасти на волне тренда, отчасти из-за того, что это пока одна из самых продвинутых и при этом общедоступных diffuse сетей. Мне до этого приходилось иметь дело только с GAN, и результаты новых моделей, несомненно, впечатляют. Давненько я не испытывал подобное восхищение, если честно.

City of the future
Таким MidJourney видит город будущего

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

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

Нам кажется, что ИИ должен стать нашим отражением, что он должен обладать нашей психологией, что он должен выполнять те же задачи, которые выполняет человек. Мы видели в кино, как роботы влюбляются в человека, а потом бросают его; как они управляют космическим кораблём, а потом убивают всю команду; как они заменяют ушедших членов семьи, а потом сами оказываются на помойке; самое главное, мы видели, как роботы стремятся убить всех человеков по вполне себе человеческим мотивам.

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

Web 3.0
А это – Web 3.0. Выглядит уже не так безоблачно и попахивает антиутопией

Лично у меня напрашивается закономерный вопрос: а зачем нам, собственно, ещё один человек, только электронный? Он решит какие-то принципиальные вопросы, стоящие перед цивилизацией, или добавит ещё ворох новых, как и всякий из нас? Почему практически все представляют себе ИИ как человека? Несомненно, весьма и весьма умного и продуктивного, но всё же человека. Разве человек – это идеал, совершенство, конечная стадия эволюции?

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

Это проистекает из того, что человек как вид неспособен к «коллективному» сознанию, в то время как наука уже подошла к рубежам знания, которые с трудом воспринимаются и обрабатываются отдельным индивидуумом. Многие вопросы остаются нерешёнными из-за весьма ограниченных оперативных мощностей нашего мозга. К тому же человек неспособен передать весь арсенал накопленных знаний (а главное – пониманий) потомству в готовом виде, а вынужден в каждом последующем поколении обучаться снова и снова, что ещё больше усложняет решение глобальных задач.

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

В таком случае весьма наивно полагать, что данный электронный мозг должен функционировать целиком и полностью по нашему образу и подобию. Несомненно, он должен обладать каким-либо интерфейсом для взаимодействия с человеком, ведь так или иначе мы должны обмениваться с ним информацией. Но сможем ли мы при этом понимать его внутренние мыслительные процессы и понимать его психологию, если она будет иметь место быть, – весьма сомнительно. Не факт даже, что мы сможем всецело и полностью интерпретировать полученные от него знания, поэтому нам придётся отказаться от понимания теоретических построений и запрашивать лишь алгоритм конкретных действий, будь то решение экологических проблем, избавление от войн и нехватки ресурсов или постройка межгалактических кораблей для колонизации Космоса.

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

Childhood
Картинка по запросу «приятные воспоминания из детства»

Ещё один важный момент. Давай представим, что у тебя есть кот или собака. А ещё лучше какая-нибудь рептилия, потому что поведение собак и кошек нам слишком часто кажется человеческим. Так вот. Жизнь этой рептилии, в общем-то, целиком и полностью определяется тобой. Что она будет есть, когда она будет есть, где она будет жить, какая у неё будет свобода действий – это всё решаешь ты как более «продвинутая» ступень эволюции. И, в общем-то, с точки зрения рептилии всё в полном шоколаде (хотя на самом деле для неё это просто обычный ход вещей).

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

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

И хотя интерфейс взаимодействия может быть весьма и весьма «очеловеченным». Таким, что при общении с электронным мозгом будет казаться, что общение происходит с живым человеком – это будет только ширма, фасад, за которым скрывается существо совершенно иного толка.

Подведём итог. Первое. Машинное обучение будет всё больше применяться в самых различных прикладных областях, в особенности – генерации потребительского контента. Но основной целью создания ИИ должна быть возможность преодоления ограничений человеческого мозга и тела в глобальных задачах науки и социума. Второе – интерпретация внутреннего состояния (души) такого ИИ будет принципиально невозможна даже при наличии полноценного интерфейса взаимодействия.

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

Bloometry

Эту статью можно прочитать на русском.

Hey, folks. I finally posted my first fully functional application on Google Play. You can download it from the link or on the official website. In this post I want to briefly talk about its life path.

Backstory

During last winter I worked on an ambitious game project and realized that implementing a non-casual game and monetizing it alone is not such a quick task. In addition, some terrible events forced me to focus on more pragmatic things.

I had an unfinished application for designers and print specialists lying around on the dusty shelf of forgotten projects, aimed to simplify a wide range of color related tasks. Among them are the creation of color harmonies, the extraction of primary colors from a photo, physically based blending of pigments, the search for the nearest shades in widely used palettes and systems, Delta-E measurement, and many other specific functions like spectral curves calculations.

Unfortunately, work on this application stopped long ago because, as you may have noticed, I planned to provide an extensive list of features, and at that moment it seemed to me that I should implement everything at once. Was it maximalism, perfectionism, superheroism? It’s hard to say now.

The funny thing is that I had my own .NET library for working with colors and their transformations. There were additional modules, each of which provided the ability to solve the above tasks. There was also a clear understanding of how to include third-party libraries (and this is important because they make Bloometry different from other similar applications).

One can only ask oneself: how was it possible that you had all the pieces of the puzzle in your hands, but didn’t manage to put them together? The answer lies in the fact that you cannot just put all the little things together into a whole picture at once. Perhaps if you have a puzzle consisting of 10 elements, then some magic may happen. But if there are much more fragments, then you still have to assemble something separately, form larger parts, look for common patterns and do another tricks.

Back then I overestimated my skills and focused on everything at once. Fortunately, the new me learned to look at some things differently, and four months ago I got the idea to return to this project, divide the implementation into separate stages, and begin with realizing the most common tasks: the creation of color schemes manually or on an image basis.

Implementation details

Many people know that the screens of our devices operate the RGB model (red, green, blue) to display colors. At least they heard about it. Someone also knows that for printing another color model is used: CMYK (cyan, magenta, yellow, key/black).

To describe a color, we simply tell how much of each component should be present in it (for example, R = 255, G = 0, B = 0 is red). But the numeric RGB or CMYK values don’t really mean anything by themselves. In the same way that the coordinates X = 10, Y = 20, Z = 30 mean nothing. To use them, to transform into each other, it is necessary to set some kind of a reference frame. In the case of colors, to define the color space. Only then your computer, monitor, or printer will be able to understand what color you want to reproduce.

One of the universal ways to specify color spaces is ICC profiles, the standard for which was developed by the International Color Consortium. Those specialists who work closely with Photoshop, Illustrator, InDesign, or CorelDRAW must have worked with them because in such professional editors the ability to use and reconfigure the profiles is a must-have feature. But in simpler utilities, things are different. They completely ignore the existence of different color spaces and provide some abstract RGB, CMYK, Lab or other models for work. This always seemed strange to me, since it is completely incomprehensible from what and to what they convert, and how to use the numbers obtained during the conversion. Well, for sure you can use them, but how correct will it be? As an example, I’ll show you how a color with components R = 30, G = 130, B = 190 looks in five different spaces: sRGB, Adobe RGB, Apple RGB, ProPhoto, and Wide Gamut.

Sample RGB swatches

A word of caution: your screen is most likely using sRGB space, and actual colors are different from what you see. Either way, the differences are easy to spot. That is why in Bloometry I decided to clearly separate the concepts of color model and color space. After specifying the model, you will be prompted to select a specific space in the corresponding form field. And some of those spaces may be actually represented by ICC-profiles.

There is another important detail. Developers for some reason do not pay attention to the color wheel often. It just so happened that artists use the Itten’s color wheel based on the RYB triad (red, yellow, blue) from which other shades are obtained by mixing. But the displays operate the RGB components mentioned above, and the color wheel for this model is different (in the HSL / HSV encoding the Hue component is responsible for the position on the wheel). And here we have a problem, Houston.

In the picture, the «artistic» color wheel is the outer circle while the RGB color wheel is the inner circle. At first glance, the difference is not so great. But if we decide to find opposite (complementary) colors on these circles, we discover that in the Itten’s version this is quite a familiar pair of red and green, but in the RGB version blue will become the opposite of red. By numbers everything is correct, both colors in pairs are separated by an angle of 180 degrees. But perceivable contrast is still considered stronger in the first case.

For example, I gave a few more samples of complementary colors. The left column contains Itten’s pairs, the right column contains RGB pairs (samples are not aligned in brightness / saturation). Bloometry implements a more established color wheel with red, yellow, and blue as primary colors.

Project philosophy

In the previous section, I described some of the details that distinguish Bloometry from other services and applications of its kind. Probably they complicate the functionality of the entire project and may scare away some users, but I believe that it is better to have an ability to flexibly customize something than not to have it at all. On the other hand, I’m thinking of a feature to switch the interface between simple and professional modes, which could solve this issue.

In general, I decided to approach the matter more thoroughly and «scientifically». Actually, my maximalism / perfectionism has not gone away, so I put the desire to dig deeper into each element of the application. Whether such a desire can be profitable is an interesting question. Perhaps it lies in the plane of doing what we think is right or what will be more popular.

Perhaps now Bloometry looks simpler and more unpretentious than the foundation that is laid in it. In part, this is good because the user should not know about the underwater part of the iceberg. However, with the gradual introduction of all the planned functions, I am sure the overall building of this project will sparkle with its multi-colored lights.


Here ends the lyrical part of my story. Thanks for reading. For those interested, I will leave one more section as an afterword.

Programming part

Bloometry is implemented using Xamarin.Forms as C# remains my main working tool. And the possibility of writing cross-platform solutions for an independent developer is still more of a plus than a minus. It is necessary to make as much code as possible independent of the target platform, since each line of code is time consuming. As a result, I can say that even with an abundance of custom UI elements, about 70% of the code remained cross-platform (80–90 with libraries taken into account).

At the heart of the project is my own Scol color library. The mathematical model of transformations is based on formulas from the widely known site of Bruce Lindbloom. Color extraction is performed using machine learning algorithms implemented in Accord.NET. The pigments mixing and calculation of spectral curves is partly based on the ideas from this great site, partly on the Kubelka-Munk theory, partly on my ability to reverse-engineer (but that’s another story). Export to various formats is based on (un)official specifications depending on the type of file.

To integrate the advertising platform, Android libraries written in Java were required. They integrated into the project after rain dancing with Xamarin’s ability to wrap AAR and JAR libraries. Next come some analytic tools like Google Analytics or Flurry.

For the functionality associated with ICC profiles, I had to resort to the C language and the Little CMS library. Initially, I wrote my own wrapper through P/Invoke, but while the application was forgotten, the stable version of the lcmsNET library came out. The only thing left was to compile the code using the Android NDK. As a result, several files are obtained for each processor architecture, which are added to the project without any problems.

Bloometry

This article is also available in English.

Здравствуй, дорогой читатель. Это свершилось – я разместил своё первое рабочее приложение в Google Play. Скачать можно по ссылке либо на официальном сайте. А в этом посте кратко расскажу о его жизненном пути.

Предыстория

Реализовать неказуальный игровой проект в одиночку и монетизировать его – не такая уж быстрая задача. К тому же в свете известных всем событий возникла необходимость заняться более приземлёнными прагматичными вещами.

На полке запылившихся проектов у меня давно валялось полусырое приложение для дизайнеров/печатников, нацеленное на упрощение самых разных задач, связанных с цветом. Среди них подбор цветовых гамм, извлечение основных цветов из фото, механическое смешение, поиск ближайших оттенков в популярных цветовых палитрах и системах, измерение Delta-E и множество других специфичных функций навроде построения спектральных кривых.

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

Самое смешное, что у меня была готова собственная .NET библиотека для работы с цветами и их преобразований. Были дополнительные надстроечные модули, каждый из которых предоставлял возможности решения поставленных выше задач. Было и чёткое понимание того, как подключить сторонние библиотеки (и это важно, потому что они делают Bloometry отличным от других подобных приложений).

Можно только спросить себя: как же так, ведь у тебя были на руках все кусочки паззла, почему не удалось соединить их воедино ещё тогда? Ответ кроется в том, что нельзя просто взять их все одновременно и сложить в цельную картину. Возможно, если у тебя детская мозаика из 10 элементов, то что-то и получится. Но если фрагментов куда больше, то всё равно придётся собирать что-то отдельно, формировать более крупные части, прибегать к хитростям навроде собирания общей рамки или поиска закономерностей в нарезке кусочков.

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

Детали реализации

Многие знают, что экраны наших устройств отображают цвета на основе модели RGB (красный – зелёный – синий). По крайней мере, слышали об этом. Кто-то так же знает, что для печати используется другая цветовая модель – CMYK (голубой – пурпурный – жёлтый – чёрный).

Чтобы задать цвет, мы просто указываем, сколько в нём должно присутствовать того или иного компонента (например, R = 255, G = 0, B = 0 – это красный). Но прелесть в том, что числовые значения RGB или CMYK сами по себе ничего не значат. Точно так же, как ничего не значат, например, координаты X = 10, Y = 20, Z = 30. Чтобы их использовать, а уж тем более преобразовывать друг в друга, необходимо задать какую-то систему отсчёта. В случае с цветами – обозначить цветовое пространство. Только тогда ваш компьютер, а вместе с ним монитор или принтер, смогут понять, какой цвет требуется воспроизвести.

Один из универсальных способов задания подобных цветовых пространств – это ICC-профили, стандарт для которых был разработан не абы кем, а Международным консорциумом по цвету. Те, кто плотно работает с Photoshop, Illustrator, InDesign или CorelDRAW наверняка сталкивались с ними, поскольку в таких профессиональных редакторах возможность их использования и перенастройки жизненно необходима.

Но в более простых утилитах дела обстоят по-другому. Они напрочь игнорируют факт существования разных цветовых пространств и предлагают для работы некие абстрактные модели RGB, CMYK, Lab или другие. Мне всегда казалось это странным, поскольку совершенно непонятно, из чего и во что они преобразуют, и как использовать полученные после преобразования цифры. Ну то есть использовать-то их можно, но насколько это будет корректно? Для примера я вам покажу, как выглядит цвет с компонентами R = 30, G = 130, B = 190 в пяти различных пространствах: sRGB, Adobe RGB, Apple RGB, ProPhoto и Wide Gamut.

Sample RGB swatches

Нужно сделать оговорку: ваш экран, скорее всего, работает с пространством sRGB, и реальные цвета отличаются от тех, которые вы видите. В любом случае, заметить отличия несложно. Именно поэтому в Bloometry я решил чётко разделить понятия цветовой модели и цветового пространства. После указания модели вам будет предложено в соответствующем поле выбрать конкретное пространство. А при возможности ещё и «подгрузить» ICC-профиль (что уж совсем космос 😀🚀).

Есть и другая немаловажная деталь, на которую разработчики дизайнерских приложений почему-то часто не обращают внимания – цветовой круг. Так уж повелось, что художники пользуются цветовым кругом Иттена на основе триады RYB (красный – жёлтый – синий), из которой путём смешивания получают другие оттенки. А вот дисплеи оперируют уже упомянутыми выше компонентами RGB, и цветовой круг для этой модели отличается (в кодировке HSL/HSV за позицию на круге отвечает компонент Hue – оттенок). И здесь возникают проблемы.

На изображении я разместил «классический» цветовой круг снаружи, а цветовой круг RGB – внутри. На первый взгляд, разница не так уж и велика. Но если мы решим найти на этих кругах контрастные (комплементарные) цвета, то обнаружим, например, что в классическом варианте это вполне себе привычная пара красный – зелёный, а вот в варианте RGB противоположным красному станет голубой. С точки зрения цифр все корректно – и там, и там цвета отделяет угол в 180 градусов. Но вот с точки зрения восприятия контраст в первом случае всё же считается сильнее.

Для примера я привёл ещё несколько образцов контрастных цветов. В левом столбце – «классика», в правом – RGB (образцы не выровнены по яркости/насыщенности). В Bloometry, конечно же, реализован более устоявшийся цветовой круг с красным, жёлтым и синим в качестве основных цветов.

Философия проекта

В предыдущем разделе я описал одни из самых ярких деталей, которые отличают Bloometry от других служб и приложений подобного рода. Наверное, они несколько усложняют функционал всего проекта и могут отпугнуть часть пользователей, но мне всё же видится, что лучше иметь возможность настроить что-то более детально, чем не иметь её вообще. С другой стороны, я уже рассматриваю для внедрения возможность переключения интерфейса между режимами «простой»/«профессиональный», которая могла бы решить данный вопрос.

В целом, как вы уже могли понять, я решил подойти к делу более основательно и «научно». В этом отношении мой максимализм/перфекционизм никуда не делся, поэтому в каждый элемент приложения я вкладываю стремление копнуть глубже и сделать детальнее. Сможет ли такое стремление дать свои плоды – вопрос интересный. Возможно, он даже лежит в плоскости того, должны ли мы делать то, что нам кажется правильным, или то, что будет более популярным.

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


Здесь заканчивается лирическая часть моего повествования. Спасибо за прочтение. Для страждущих оставлю в качестве послесловия ещё один раздел.

Технические тонкости

Bloometry реализовано с помощью Xamarin.Forms, поскольку C# остаётся моим основным рабочим инструментом. Да и возможность написания кроссплатформенных решений для независимого разработчика – это всё же больше плюс, чем минус, поскольку пресловутые человеко-часы никто не отменял, и необходимо как можно больше кода сделать независимым от целевой платформы. По итогу могу сказать, что даже с обилием кастомных UI-элементов, примерно 70% кода осталось общим (а если учитывать библиотеки, то и все 80–90).

В сердце проекта – моя собственная библиотека для работы с цветами Scol. Математическая модель преобразований основана на формулах с широко известного в узких кругах сайта Брюса Линдблума (Bruce Lindbloom). Извлечение цветов производится с помощью методов машинного обучения, реализованных в Accord.NET. Смешение и построение спектральных кривых отчасти базируется на идеях с этого прекрасного сайта, отчасти – на теории Кубельки-Мунка (Kubelka-Munk theory), отчасти – на моих способностях к реверс-инжинирингу (но это уже совсем другая история). Экспорт в различные форматы сделан на основе (не)официальных спецификаций в зависимости от того или иного типа файла.

Не обошлось и без использования других языков. Для интеграции рекламной платформы потребовались Android-библиотеки, написанные на Java, которые после танцев с бубнами всё же интегрировались в проект и повели себя вполне буднично по отношению к окружению. Смимикрировали, так сказать, как будто бы они изначально были написаны для .NET. Далее на очереди – что-нибудь аналитическое навроде Google Analytics или Flurry.

А вот для особого функционала, связанного с ICС-профилями, пришлось прибегать к более тяжёлым веществам тяжёлой артиллерии – языку C и библиотеке Little CMS. Изначально я писал свою собственную обёртку через P/Invoke, но за то время, пока приложение пылилось на полке, вышла готовая библиотека lcmsNET. Дело оставалось только за тем, чтобы скомпилировать сишный код с помощью Android NDK. На выходе получаются несколько файлов под каждую архитектуру процессора, которые без проблем добавляются к проекту.

Game Design 101

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

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

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

Временная шкала разработки игрового проекта
Переходить от первого этапа сразу к третьему – весьма опрометчивое решение

В игровом деле разработка идеи начинается с гейм-дизайна. Капитан Врунгель пел: «Как вы яхту назовёте, так она и поплывёт…». Перефразируя под наши нужды: «Как вы дизайн-документ составите, так и ваша игра выйдет в релиз». Или не выйдет, если план будет составлен по-дилетантски. После некоторых поисков в руки мне попалась замечательная книга, посвящённая созданию этого самого плана – Games, Design and Play: A detailed approach to iterative game design (Colleen Macklin, John Sharp). Изюминка в том, что параллельно авторы рассматривают множество сопутствующих концепций: философию, психологию, динамику игр. Разбирают их по винтикам и шпунтикам.

Games, Design and Play: A detailed approach to iterative game design (Colleen Macklin, John Sharp)
С первых страниц понятно – замечательное исследование

Без воды и лишних предисловий уже в первой главе получаем выжимку базовых элементов любой игры:

  • Действия – активности, которые проявляет игрок, пытаясь достичь целей игры.
  • Цели – результат, которого пытаются достичь игроки по результатам игры. Причём неважно, являются ли они измеримыми величинами или рождаются из игрового опыта.
  • Правила – инструкции о том, как функционирует игра.
  • Объекты – игровые сущности, которые игрок использует для достижения цели.
  • Игровое пространство – окружение, которое определяется правилами, и в котором происходит игровой процесс.
  • Игроки – основные действующие лица игры.

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

  • Дизайн второго порядка: в процессе разработки проекта игровой опыт создаётся косвенно через совокупность правил, действий и целей. Сама игра приходит в движение и обретает форму только тогда, когда в ней появляются игроки. Об этом важно помнить на любом этапе: мы создаём произведение, которое является частично «незавершённым» – нам, по сути, неизвестен его конечный вид.
  • Пространство вариантов: интерактивность даёт игрокам возможность выбирать различные действия и трактовки игровых элементов. В том время как дизайнер не может предугадать все возможные шаги и впечатления игрока, он может ограничить или расширить арсенал потенциальных вариантов, комбинируя действия, правила, цели, пространство и объекты. В противовес первому пункту, в наших руках остаются инструменты, позволяющие рассказать о нашей идее игроку. И в этом, думаю, состоит важный показатель профессионализма игрового мастера – умение найти баланс между свободой действий игрока и нарративом игровой истории.
  • Состояние игры: это моментальный снимок текущих параметров всех игровых элементов на пути игрока к целям. Это состояние постоянно изменяется в зависимости от вовлечённости игрока в игровой процесс. А сумма таких «кадров» расскажет о масштабах вашей задумки.
Коллаж из игровых персонажей
Их невероятно много. Но мы дойдём до сути и поймём, что их роднит

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

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

Моделирование дорожного трафика и библиотека FollowMe

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

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

Логотип для своего проекта я ещё не придумал, но только посмотрите, как притягательны эти низкополигональные модельки

В той игре, которую я планирую разработать, дорожный трафик занимает чуть ли не центральную часть. По крайней мере, это будет один из самых важных аспектов во всём дизайне игрового мира. К тому же система с таким количеством сущностей (100 000 транспортных средств для моей задумки – не предел) сама по себе является достаточно сложным программным проектом, реализация которого может неплохо поднять уровень навыков да и вообще быть показателем того, насколько мои идеи реализуемы.

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

Follow Me library traffic jam
Не успели выехать на улицы, как тут же встали в виртуальные пробки. Реализм!

Надо сказать, что реализуемая мной идея далеко не нова – самые ранние публикации на тему компьютерного моделирования трафика, которые мне довелось изучить, датировались началом 80-х годов. С тех пор появилось множество наработок в этом направлении, но все их можно разделить на три большие подгруппы: макро, микро и гибридные. В макро, как следует из названия, мы опускаем индивидуальные детали каждого транспортного средства и пытаемся сформировать некий общий поток, как если бы наши магистрали были трубами, а потоки машин потоками воды. Я не шучу, многие макромодели используют в качестве основы законы гидродинамики. В противоположность им ставятся микромодели, где моделируется поведение отдельных сущностей в зависимости от дорожной ситуации, особенностей транспортного средства и характера водителя. Здесь основу составляют following-модели (модели следования, то есть большую часть времени мы ориентируемся на следующее впереди нас ТС). Здесь сразу напрашивается очевидный плюс этих систем: более точное моделирование с учётом индивидуальных особенностей. К сожалению, это требует и бОльших расчётов – для крупных сетей такие модели не всегда подходят (особенно для моделирования в реальном времени). Поэтому существуют гибридные модели, объединяющие два этих подхода. Ведь, по сути, большую часть времени машины движутся в общем потоке, который мало отличается от потока воды, а на перекрёстках мы просто переходим к индивидуальным моделям. Из минусов – сложность разработки таких систем. По крайней мере, с моим текущим уровнем математики мне пока что не удалось создать в голове чёткого понимания их работы.

Follow Me library with debug info
Отображение технической информации позволяет отследить детали, важные для создания и функционирования сетей

Как видно из названия моей библиотеки, я выбрал в качестве основы модель следования. В самом простом понимании эта модель рассчитывает ускорение транспортного средства в конкретный момент времени t. И всё. То есть мы берём наши сущности, рассчитываем для каждой ускорение в зависимости от окружающих условий. А, узнав ускорение, вычисляем скорость и положение в некий последующий момент времени t+Δt. И «перемещаем» глобальное время на эту позицию. Чтобы повторить всё то же самое снова.

И всё было бы просто, если бы весь мир стоял на одной единственной очень длинной дороге шириной в две полосы. Но ведь есть ещё перекрёстки, светофоры, дорожные знаки, многополосное движение, парковки, непредсказуемые пешеходы, велосипедисты и неопознанные летающие объекты. Они-то и вносят всю смуту в нашу стройную систему. И простая following-модель превращается в массивного динозавра, который должен учесть множество дополнительных факторов, прежде чем наше авто перепрыгнет в своё счастливое Δt-будущее.

Им ещё многому предстоит научиться. Но хотя бы не сталкиваются, уже хорошо!

На текущий момент я уже более-менее разобрался со скоростным режимом полос, приоритетами, перекрёстками, светофорами и стоп-линиями. А также добавил возможность формировать составные ТС (ведь трамваи и грузовики могут состоять из нескольких частей). На повестке дня – параллельные перестроения. Крепкий орешек, который затрагивает практически все аспекты моделирования. Многие части уже написанного кода, в которые оно обещало хорошо вписаться, на деле оказались неподготовленными, и подвергаются переработке. Причиной тому некоторые преждевременные оптимизации (никогда не начинайте оптимизацию прежде, чем у вас будет готов рабочий прототип – успеется!). А также наивная уверенность в том, что простые прикидки в уме позволят в будущем подружить существующий код с крупной партией новых возможностей. Но, в целом, всё не так уж печально. Ведь мои подопечные хоть и с неохотой, но всё же начинают перестраиваться в новые полосы, расталкивая конкурентов и устраивая опасные ситуации.

Сейчас рано говорить о дате релиза библиотеки, но она обязательно будет иметь модуль интеграции с движком Unity, доступный на Asset Store. Чтобы получилось многофункциональное решение для внедрения в любой игровой мир масштабной транспортной сети. Кому-то это позволит оживить статичное окружение, добавить очарования или даже написать свою собственную стратегию. Но ещё больше я надеюсь на то, что мой проект поможет в дизайне реальных транспортных систем и решении проблем городского трафика. Ведь, пусть он и реализован в игровой форме, весь его фундамент заложен на научной основе. Как и во многих других проектах индустрии. Так что никогда не стоит сбрасывать игры со счетов в вопросах реального мира.