Эта статья была впервые опубликована на:Уокер ИИ
Каковы впечатления от игр с обычными игроками при использовании ИИ?
Вам не нужно играть в игру напрямую, просто позвольте ИИ играть за вас, и через некоторое время вы увидите, как вы забиваете. Это так здорово, вы сэкономили все деньги, которые вам нужны, чтобы тренироваться в качестве силового тренера, все в порядке. Однако сегодня мы здесь, чтобы обсудить серьезные технические вопросы. Как использовать ИИ для реализации нашего автоматизированного тестирования! Это наша цель.
Соревновательная игра, здесь мы ее немного разделяем, и делим на внешний интерфейс и внутреннюю битву. Например, такие как ЛОЛ, в лобби, команде и интерфейсе выбора героя, это все внешние интерфейсы. Когда мы ждем, чтобы прочитать длинную полосу прогресса, войти в игру и услышать звук «дон дон дон дон», перед нами появляется герой, в это время вы уже прибыли на часть внутриигровой боевой.
1 Обзор
В этой статье в основном объясняется автоматизация внутриигровых сражений. Он включает в себя, как реализовать процесс боевой автоматизации и саму структуру работы скрипта.Читатели должны иметь некоторый опыт программирования на Python и опыт разработки автоматизации пользовательского интерфейса. В частности, используется ИИ, предоставляемый внутренней командой компании для операций по принятию решений. Проще говоря, мы сообщаем ИИ о текущей ситуации в игре, ИИ думает об этом, возвращается для принятия решения, а мы используем автоматизированный скрипт для выполнения решения. Но можно и без ИИ сделать автоматизированное тестирование, нужно самому построить нужный процесс, вызов ИИ это как условный рефлекс, а самостоятельное построение соответствующего сценария процесса как безусловный рефлекс.
Для автоматизации пользовательского интерфейса игры он реализован в виде poco's unitysdk.
Небольшое введение в poco. Это похожая на appium среда автоматизации пользовательского интерфейса на стороне клиента, которая использует элементы интерфейса для автоматизации пользовательского интерфейса.
Официальная документация:poco-Chinese.read the doc S.IO/this_cn/latshan…*
Элементы поступают из UITree, а UITree — из игрового клиента, подключенного к unitysdk. Через сокет-соединение с внешним агентом монтирования UITree игры, использующей движок единства, возвращается наружу для автоматизации.
UITree содержит всю информацию об атрибутах соответствующих элементов в дереве, включая атрибут положения (информацию о положении) элемента, который также является основной основой для блокировки соответствующего элемента для работы.
Получите информацию об уровне пользовательского интерфейса игрового клиента через pocosdk и выполните соответствующую обработку определенного содержимого в информации пользовательского интерфейса.
Наконец, соответствующие данные возвращаются обратно в ИИ, и ИИ примет соответствующее решение.После возврата информации о решении локальному пользователю выполняется соответствующий код операции автоматизации пользовательского интерфейса для завершения решения.Посредством реализации большое количество решений, работа всей ситуации в режиме реального времени завершена.
Затем вводятся несколько раундов механизмов обнаружения повторного открытия для завершения автоматической битвы внутриигровых сражений.
- Несколько простых демонстраций:
В проекте единства вам необходимо установить SDK Poco в единстве. Метод вызова Poco
import time
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
poco('btn_start').click()
time.sleep(1.5)
shell = poco('shell').focus('center')
for star in poco('star'):
star.drag_to(shell)
time.sleep(1)
assert poco('scoreVal').get_text() == "100","score correct."
poco('btn_back',type = 'Button').click()
## Poco调用举例
poco = UnityPoco() #1、通过接口调用unity中的pocosdk,SDK对整个ui树进行遍历,将dump后的json信息传出以供调用。
poco('btn_start').click() #2、在得到的UI树中找到‘btn_start’的元素位置信息,通过adb进行点击操作。
2. Конкретный процесс
- Описание процесса:
Проверяя каждый раз текущие данные пользовательского интерфейса, можно определить, находится ли он внутри бюро или за его пределами. Вне офиса войдет в игру в офисе, а в офисе обнаружит текущее состояние в офисе, интегрирует текущую информацию о пользовательском интерфейсе в офисе, извлечет указанную информацию и отправит ее в систему принятия решений ИИ. service, а затем выполните соответствующие операции с кодом автоматизации пользовательского интерфейса в соответствии с возвратом AI.
3. Процесс реализации
3.1 Сбор данных уровня пользовательского интерфейса
-
Используйте poco.freeze и используйте дамп агента внутри, чтобы сохранить текущее дерево пользовательского интерфейса (поскольку используется корневой узел, содержимое корневого узла не может быть получено дочерними элементами).
-
Другие данные можно извлечь, вызвав обычный метод poco с помощью poco.freeze.
3.2 Определение извлечения данных
-
Подтвердите, какие данные в общей сложности должен предоставить ИИ, и могут ли эти данные быть считаны из информации пользовательского интерфейса игры. После подтверждения мы можем начать извлекать соответствующие элементы.
-
Необходимо обратить внимание на то, доступны ли извлекаемые элементы пользовательского интерфейса только в конкретном пользовательском интерфейсе, и можно ли его легко получить, то есть судить о сложности извлечения указанной информации и необходимости условного построения.
-
Взяв за пример игру в автошахматы, извлечение шахматных фигур будет более сложным, потому что нет координат, соответствующих каждой сетке на шахматной доске, а только художественные ресурсы, размещенные в корневом каталоге. Одну из данных в этой части нужно хранить и извлекать методами записи, а другую — судить, находится ли она на поле или в руке по информации, содержащейся в атрибутах.
В настоящее время эта часть судебного решения прошла три этапа: А. Судя по атрибуту pos. б) Судя по атрибуту rawpos, добавленному путем изменения исходного кода C++ pocosdk, подключенного к единству. в) полагаться на всестороннее суждение обоих, чтобы гарантировать, что не будет неправильного суждения.
3.3 Процесс запроса интерфейса данных
Образец запроса данных:
{"round_drawscount": 0, "round_actionscount":2, "round":17,"level":6, "experience":2, "money":33, "blood":73,}
То есть данные json, которые содержат некоторую основную информацию об игроке.
Интерфейс AI возвращает данные:
{'eventId': ACTION_UPGRADE}{'eventId': ACTION_DRAW}{'eventId': ACTION_PICK,'params': {'draw_cardIndex': 0}}{'eventId': ACTION_DROP,'params': {"hand_cardIndex":0}}{'eventId': ACTION_SWAP, 'params':{"hand_cardIndex":0,"play_listIndex":1}}{'eventId': ACTION_SWAP, 'params':{"hand_cardIndex":2,"play_listIndex":1}}{'eventId': ACTION_SWAP, 'params':{"hand_cardIndex":0,"play_listIndex":2}}
Это, грубо говоря, контент для принятия решений в каком-то игровом ИИ, который говорит вам, что делать с помощью различных идентификаторов событий. Вот пример текущей игры в авто шахматы.
Конкретное содержание возврата формулируется в соответствии с фактическими потребностями бизнеса.
Примечания к интерфейсу:
- Все отправленные параметры необходимо согласовать с разработчиком.
- Позже будут внесены изменения и техническое обслуживание, например, требования к передаче параметров, а также добавление и удаление параметров.
- Обратите внимание, что отправленные данные обрабатываются в стандартном формате.
3.4 Вернуться к реализации решения
Реализация решения Вот пример работы игры в автошахматы:
- Проведите по доске: убедитесь, что магазин открыт и обновите.
- Купить шахматные фигуры: убедитесь, что магазин открыт, чтобы купить шахматные фигуры на соответствующей позиции индекса.
- Увеличение населения: кнопка, которая будет доступна в любое время, просто используйте ее напрямую.
- Поменяйте местами шахматные фигуры вверх и вниз: в зависимости от того, есть ли шахматные фигуры в соответствующем индексе, судят о решении соответствующих шахматных фигур.
- Продать шахматные фигуры: щелкните соответствующую позицию индекса, а затем нажмите кнопку продажи.
#对应返回eventID执行不同操作
eventid = self.reqs_data["eventId"]
if eventid == 0:
self.round_over([])
elif eventid == 1:
self.read_chessbook()
elif eventid == 2:
self.refresh()
elif eventid == 3:
self.buy_chess(self.reqs_data["params"]["draw_cardIndex"])
elif eventid == 4:
self.sell_chess(self.reqs_data["params"]["hand_cardIndex"])
elif eventid == 5:
self.up_down_change(self.reqs_data["params"])
3.5 Введение в платформу запуска сценариев
На самом деле классификация этой структуры относительно проста, с четырьмя большими блоками.
- runner:
Содержит триггеры, запускающие обнаружение, которые используются для передачи указанного имени пакета, выбора соответствующего сервера и других операций для выполнения операций, связанных с непрерывной интеграцией. Содержит вызов действия для выполнения операции, соответствующей возвращаемому значению. Содержит записи журналов, журналы запуска игр и журналы adb во время процесса записи. Включая запись экрана, запись текущего видео во время игры и отправку видеоданных в интерфейс обнаружения пользовательского интерфейса, чтобы определить, есть ли какие-либо аномалии пользовательского интерфейса (в основном белый экран и другие очевидные аномалии пользовательского интерфейса).
- datas:
Файл записи данных о ходе игры, включая хранение журналов и хранение соответствующих результатов боя в игре (например, текущий раунд, результат рейтинга боя в этом раунде).
- common_cls:
некоторые общие модули Содержит связь с ИИ, отправку и возврат данных Общие операции, включая пользовательский интерфейс, такие как автоматическая установка соответствующей версии игрового клиента для запуска игры, очистка руководства для новичков, создание новой учетной записи и т. д. Содержит функции, вызывающие соответствующие методы операций пользовательского интерфейса для принятия решений ИИ, то есть функции действия.
- требования:
Весь проект выполняется через python.Это файл, который поможет вам установить все необходимые библиотеки одним щелчком мыши.Это включает в себя некоторую вторичную разработку фреймворка poco, который необходимо модифицировать локально перед использованием.
Грубый процесс бегуна:
Убедитесь, что ваше устройство было подключено к компьютеру для отладки, а затем запустите локальную связь между poco и adb, оцените, находится ли текущий пользовательский интерфейс в офисе, извлеките указанную информацию в офисе, отправьте ее в AI для принятия решения, а затем выполнить решение ИИ.
Многораундовый процесс реализуется путем перезапуска каждый раз, когда битва окончена или нет Блок-схема бегуна в основном такая же, как и конкретная блок-схема реализации.
3.6 Связанные проблемы оптимизации
-
Что касается черного списка: в относительно большой игре элементы внутриигрового боя и пользовательский интерфейс также очень сложны.Информация дерева пользовательского интерфейса, сохраненная один раз, также содержит более 2 М данных, и время получения будет увеличиваться вместе с пользовательским интерфейсом. сложность. С точки зрения конечного эффекта, время приобретения будет постепенно увеличиваться с 1 секунды до 4 секунд от ранней стадии к более поздней стадии боя.Такая скорость не может удовлетворить потребности бизнеса.Поэтому рекомендуется добавить черный список механизм для unitySDK poco для повышения скорости сбора данных Эффективность UITree.
-
Рекомендуется использовать функцию замораживания. Многократное извлечение приведет к потере времени на повторное получение элементов пользовательского интерфейса. В настоящее время эта проблема решена, и все параметры могут быть извлечены только один раз. В настоящее время из-за сложной структуры пользовательского интерфейса внутриигровых сражений в крупных играх требуется от одной до трех секунд для однократного получения информации об пользовательском интерфейсе.
-
Проблема времени работы слоя пользовательского интерфейса: есть две ямы, которых следует избегать 1. Скриншот minicap: если его отключить, фактически будет использоваться поведение записи экрана, и скриншоты не требуются. Запуск службы снимков экрана потребует времени, а сам снимок экрана также потребует производительности. 2. Установление связи с локальным сокетом Adb: убедитесь, что одно установление, что является необходимым условием для таких инструкций, как poco click swipe и т. д., вам нужно запустить его заранее, чтобы они могли постоянно общаться, так что это значительно сократит время одной операции. Теперь можно контролировать время одной операции: самое быстрое — 0,2 секунды, а самое медленное — 0,8 секунды.
-
Время получения UITree: путем наблюдения было обнаружено, что время получения UITree положительно связано со сложностью интерфейса. Относительно простой внеофисный интерфейс можно освоить за 0,5 секунды, а более сложный внутриигровой бой занимает около 2 секунд. Для практической эксплуатации такой процесс слишком долог. На данный момент исследованы два решения: 1. Использовать черный список 2. Выгружать дамп только один раз, при этом обновленные данные не получаются повторно, а данные, использующие ожидаемые результаты, сохраняются локально.
Для ознакомления со статьей о модификации пакета SDK слоя c++ от poco попробуйте Baidu.
3.7 Примечания
-
Время на однократное получение информации о пользовательском интерфейсе будет увеличиваться с увеличением сложности пользовательского интерфейса, который усложняется в игре, особенно на более позднем этапе. Обычно от двух до трех секунд фактическое использование должно быть оптимизировано в соответствии с проектом.
-
Обработка полученных необработанных данных для извлечения соответствующих данных занимает около 0,2 секунды.
-
Необходимо обеспечить достаточный временной интервал между операциями: во-первых, дождаться обновления пользовательского интерфейса после операции, а во-вторых, убедиться, что для переключения пользовательского интерфейса требуется время для отображения содержимого.
-
Функция двойного щелчка должна отслеживать, может ли быть реализована операция существующего клиента (ни двойной щелчок adb, ни poco), а некоторые клиенты требуют, чтобы временной интервал между двумя щелчками двойного щелчка был слишком коротким, и он может не реализовать автоматизацией.
4. Вывод
В этой статье в основном описывается способ автоматического запуска игр путем вызова ИИ в игре.
Используя эту структуру, вы можете проводить несколько раундов тестирования процесса (даже подсчета очков) в игре, чтобы помочь тестируемым избежать боли от многократного тестирования плоти и крови внутриигровых сражений. В то же время видео процесса может быть записано, и ИИ или другие API могут определить, есть ли белый экран, ошибка adb и информация об ошибке единства могут быть собраны в режиме реального времени.
Это наш первый шаг к автоматическому тестированию ИИ, и мы также будем проводить исследования стороннего исследовательского обхода ИИ.
PS: Для получения дополнительной технической галантереи, пожалуйста, обратите внимание на [Публичный аккаунт | xingzhe_ai] и обсудите с ходоками!