15 января 2018

Крис Кроуфорд. Призыв чаще использовать арифметические методы

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

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


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

Есть веская причина такого засилья булевых операций в компьютерных играх: многие игровые дизайнеры суть бывшие программисты, а программисты быстро учатся «булеву мышлению». Чем опытнее программист, тем комфортнее он себя чувствует с булевыми операциями. 

Но булевы операции не очень хорошо отражают реальность.
Крис Кроуфорд (Chris Crawford),
человек-легенда, личный сайт
Они – ловкое притворство, интеллектуальный костыль, далёкий от естественных, природных процессов. У булевых операций есть два главных плюса: они хорошо работают на компьютерах, и их легко понять. 

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

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

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

Дано три актора, A, B и C. Актор A собирается предпринять некое действие в отношении B. Актор C будет наблюдать. Действие A может быть полезным либо вредным для B. Актору C может нравиться или не нравиться актор B. Нужно рассчитать реакцию актора C на действие актора A. Будет ли она одобрительной или неодобрительной

Булево решение достаточно простое: 
C Одобряет = C Нравится BA Вредит B 

Здесь символ «⊻» означает булевый оператор «исключающее ИЛИ» 

Арифметическое решение с виду тоже простое: 

C Одобряет = C Нравится B x Результат B 

Здесь «x» обозначает умножение. 

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

Арифметическое вычисление занимает немного больше времени. В уравнение введено больше условий. Например, значение «C нравится B» будет положительным, в случае, если актору C нравится B и отрицательным – если нет. Аналогично, значение «Результат B» будет положительным, если действие актора A полезно для B и отрицательным – если вредно

Можно сравнить эти два способа вычислений, прикинув количество отдельных исходов, которые может породить каждый из них. Булево вычисление даёт ровно четыре результата, так что его проверка не займёт много времени. А вот арифметическое вычисление даёт 2^32 результатов, если мы работаем с 16-битными машинными словами. Физически невозможно проверить все результаты и их функции. Это и есть причина неохотного использования арифметических методов. Булева логика легко проверяется и очень надёжна. В то же время арифметические методы требуют работы мозга, представления результата без возможности прямого подтверждения. 

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

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

Я думаю, что проблема лежит в неочевидности подхода к верному использованию арифметических методов. Вернёмся к нашему примеру. Отношения акторов легко выразить булевыми терминами («Если вы причините вред тому, кто мне нравится, я выражу неодобрение»). Но в более общей арифметической форме отсутствует чёткое вербальное выражение («Я выражу одобрение или неодобрение вашими действиями пропорционально тому вреду или пользе, которые вы нанесли объекту, а также степени моего положительного или отрицательного отношения к нему»). Арифметические выражения более мудрёные, чем булевы. 

Эта мудрёность отпугивает неумёх и привлекает перфекционистов. Да, арифметические методы сложнее использовать. Да, они сложнее, потому что мощнее. Да, чтобы их использовать, нам приходится больше думать. Но разве не в этом состоит наша работа? 



The Journal of Computer Game Design выпуск 1
5 декабря 1987 года 

Оригинал статьи: ссылка

Комментариев нет:

Отправить комментарий