Game Programming Patterns / Паттерны программирования в играх: 3.1 Bytecode
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Цель zwyagel 01.05.14 в 13:09 |
|
|
Дать поведению гибкость данных путём кодирования его в виде инструкций виртуальной машины. Mingun 04.05.14 в 07:15 |
||
|
Мотивация zwyagel 01.05.14 в 13:09 |
||
|
Создание игр может быть увлекательным делом, однако же оно не такое простое. Mingun 04.05.14 в 07:18 |
||
|
Современные игры требуют огромных, сложных кодовых баз. Mingun 04.05.14 в 07:18 |
||
|
Производители консолей и модераторы магазинов приложений выставляют строгие требования к качеству продукта и одна ошибка с последующим падением приложения может закрыть вашей игре путь на рынок. Mingun 04.05.14 в 07:24 |
||
|
Я работал над игрой, которая состояла из шести миллионов строк кода на языке C++ . zwyagel 01.05.14 в 13:11 |
||
|
Для сравнения, ПО, контролирующее марсоход Curiosity, насчитывает меньше половины этой величины. Mingun 04.05.14 в 07:17 |
||
|
В тоже время, мы хотим выжать производительность для каждой платформы до последней капли. Mingun 04.05.14 в 07:26 |
||
|
Игры нагружают аппаратное обеспечение как никакое другое программное обеспечение и мы неустанно должны оптимизировать свой код просто чтобы идти в ногу с конкурентами. Mingun 04.05.14 в 07:28 |
||
|
Чтобы справиться с требованиями высокой стабильности и производительности, мы обращаемся к супер-тяжёлым языкам, вроде C++, которые имеют как низкоуровневую выразительность, чтобы по-максимуму использовать возможности оборудования, так и богатую систему типов для предотвращения, или хотя бы изолирования, ошибок. Mingun 04.05.14 в 07:31 |
||
|
Мы гордимся своим мастерством, но всё имеет свою цену. Mingun 04.05.14 в 07:32 |
||
|
Будучи опытным программистом с годами соответствующей подготовки, после всего этого вы вынуждены бороться с самим масштабом вашей кодовой базы. Mingun 04.05.14 в 07:35 |
||
|
Время сборки больших игр может колебаться где-то от «пойду выпью кофе» и до «пойду прожарю свои собственные бобы, вручную перемелю их, заварю эспрессо, добавлю немного молока и попрактикуюсь в искусстве пить латте». Mingun 04.05.14 в 07:39 |
||
|
В дополнение к этим проблемам, игры имеют ещё одно неприятное ограничение: разработка должна проходить с удовольствием. Mingun 04.05.14 в 07:41 |
||
|
Игроки требуют ощущений от игры, как от романа, но она всё ещё должна быть хорошо сбалансирована. Mingun 04.05.14 в 07:43 |
||
|
Для этого требуются постоянные итерации, но если для каждой правки требуется теребить инженера, чтобы он покопался в дебрях низкоуровневого кода, а затем ждать остужающую пыл перекомпиляцию, вы убьёте своё творческое настроение. Mingun 04.05.14 в 07:46 |
||
|
Бой заклинаниями! Mingun 04.05.14 в 08:04 |
||
|
Предположим, мы работает над магическим файтингом. Mingun 04.05.14 в 07:50 |
||
|
Пара волшебников принимают боевую стойку и бросаются друг в друга заклинаниями до тех пор, пока не будет объявлен победитель. Mingun 04.05.14 в 07:53 |
||
|
Мы могли бы определить эти заклинания в коде, но это означало бы, что необходимо каждый раз привлекать инженера для изменения каждого заклинания. Mingun 04.05.14 в 07:54 |
||
|
Когда дизайнер захочет подправить несколько цифр, и посмотреть, что получится, нужно будет перекомпилировать всю игру, перезагружать её и снова возвращаться к бою. Mingun 04.05.14 в 07:56 |
||
|
Как и большинство сегодняшних игр, нам так же необходимо иметь возможность обновлять её после распространения, как для правки ошибок, так и для добавления нового содержимого. Mingun 04.05.14 в 07:59 |
||
|
Если все заклинания жёстко заданы в коде, обновление будет означать фактическую правку исполняемого файла игры. Mingun 04.05.14 в 08:00 |
||
|
Давайте пойдём немного дальше и скажем, что мы также хотим поддерживать модификацию игры. Mingun 04.05.14 в 08:01 |
||
|
Мы хотим позволить игрокам создавать их собственные заклинания. Mingun 04.05.14 в 08:01 |
||
|
Если все они зашиты в коде, то это означает, что каждый моддер должен иметь полный набор инструментов для построения игры, а мы должны выпустить её исходный код. Mingun 04.05.14 в 08:02 |
||
|
Хуже того, если они допустили ошибку в своём заклинании, это может обрушить игру на машинах других игроков. Mingun 04.05.14 в 08:03 |
||
|
Данные > код Mingun 04.05.14 в 08:04 |
||
|
Понятно, что язык реализации нашего движка не подходит для этих целей. Mingun 04.05.14 в 08:05 |
||
|
Нам нужно, чтобы заклинания были безопасно отгорожены от ядра игры. Mingun 04.05.14 в 08:06 |
||
|
Мы хотим, чтобы их можно было легко изменять и перезагружать, так же мы хотим физически отделить их от остальной части исполняемого файла. Mingun 04.05.14 в 08:08 |
||
|
Не знаю, как насчёт вас, но для меня это звучит как что-то, очень похожее на данные. Mingun 04.05.14 в 08:08 |
||
|
Если бы мы смогли определить наше поведение в отдельных файлах с данными, которые игровой движок загружал и в некотором роде «выполнял», мы бы достигли всех наших целей. Mingun 04.05.14 в 08:10 |
||
|
Нам просто нужно понять, что значит «выполнить» применительно к данным. Mingun 04.05.14 в 08:11 |
||
|
Как сделать некоторые байты в файле выражающими поведение? Mingun 04.05.14 в 08:13 |
||
|
Есть несколько способов. Mingun 04.05.14 в 08:13 |
||
|
Я думаю, оценить сильные и слабые стороны этого шаблона нам поможет сравнение с другим шаблоном: Интерпретатор. Mingun 04.05.14 в 08:16 |
||
|
Шаблон Интерпретатор Mingun 04.05.14 в 08:16 |
||
|
Я мог бы написать целую главу об этом шаблоне, однако четверо других парней уже сделали это за меня. Mingun 04.05.14 в 08:18 |
||
|
Вместо этого я втисну сюда кратчайшее введение. Mingun 04.05.14 в 08:19 |
||
|
Оно начинается с языка — думайте о нём, как о языке программирования — который вы хотите выполнить. Mingun 04.05.14 в 08:21 |
||
|
Скажем, для примера, он поддерживает арифметические выражения вроде таких: Mingun 04.05.14 в 08:22 |
||
|
(1 + 2) * (3 - 4) Mingun 04.05.14 в 08:22 |
||
|
Вы берёте каждую часть этого выражения, каждое правило в грамматике языка, и превращаете его в объект. Mingun 04.05.14 в 08:23 |
||
|
Числовые литералы будут объектами: Mingun 04.05.14 в 08:24 |
||
|
В основном, это просто маленькие обёртки над сырыми значениями. Mingun 04.05.14 в 08:25 |
||
|
Операторы также будут объектами и они будут ссылаться на свои операнды. Mingun 04.05.14 в 08:26 |
||
|
Если принять во внимание скобки и приоритет, это выражение магическим образом превращается в маленькое дерево объектов: Mingun 04.05.14 в 08:27 |
||
|
Что это за «магия»? Mingun 04.05.14 в 08:28 |
