Pull to refresh

Бот Starcraft 2 на основе перехвата и анализа рендеринга

Reading time3 min
Views14K
Matthew Fisher из Стэнфордского Университета написал интересную статью о реализации бота на основе перехвата потока API библиотеки D3D9 (Microsoft Direct 3D, являющуюся частью библиотеки DirectX).

Как пишет сам автор, бот играет в Starcraft 2 (SC2) перехватывая, понимая и реагируя на поток сообщений D3D9, посылая нажатия клавиш и движения мыши обратно игре. Он не похож на других ботов, сделанных на основе редактора SC2 и использующих скриптовый язык, или проектов наподобии BWAPI (работает только с оригинальным StarCraft), который внедряется в адресное пространство игры. Боты, основанные на этих методах зачастую имеют возможность обойти ограничения, с которыми сталкивется человек при игре; например, они могут одновременно отдавать разные приказы разным юнитам, они могут видеть происходящее вне экрана в любое время, им не составляет труда добраться до наземного юнита, закрытого летающим.




В статье довольно много технических подробностей и выложены исходники кода, которые реализуют бота. Основная задача статьи – показать простую программу, которая работает как перехватчик и интерпретатор команд D3D9. Преимущество такого подхода к реализации бота по сравнению с другими методами (внедрение в адресное пространство, написание бота на скриптовом языке SC2) очевидны – метод универсален и его можно применять к другим программам, создание бота по этому методу должно быть легче и доступнее. Недостатки метода тоже довольно очевидны: на разбор сцены уходит довольно много времени и сил и достичь APM (количество действий в минуту) сравнимых с другими методами скорее всего не получится.

Бот разделен на три компонента:

1. Mirror Driver – хранилище базовых объектов, которые отрисовываются на карте. Объекты представляют собой текстуры, шейдеры, пиксели и другую базовую графическую информацию.
2. Scene Understanding – данные, полученные Mirror Driver поступают на вход этому компоненту, который преобразовывает их в сущности, которые присутствуют в игре. То есть переводит базовую информацию на более высокий уровень, с которой уже можно строить стратегию управления игрой.
3. Decision Making – компонент, отвечающий за принятие решения, или по-простому – мозги бота.

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

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



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

Самой интересной частью конечно же является наблюдение за игрой бота и его действий. Автор статьи записал видео игры под управление бота:


По результатам анализа игры SC2 показал, что в “спокойное” время APM бота находится в пределах 500 действий, в режиме битвы от 1000 до 2000. Не все эти действия полезны и микроуправление сложно реализовывать; команды бота могут быть бесполезны или даже вредны, по сравнению с поведением юнита по умолчанию.

Учитывая что автор ставил целью статьи именно показать, какие инструменты можно использовать для написания “базы” бота, а не реализацию самого бота, это довольно хороший результат. Ведь для улучшения показателей бота, можно менять компонент принятия решений, особых технических ограничений для построения бота такая реализация не накладывает.
Tags:
Hubs:
+65
Comments57

Articles