Тестирование автоматизации игр — внутриигровые сражения

искусственный интеллект контрольная работа игра

Эта статья была впервые опубликована на:Уокер ИИ

Каковы впечатления от игр с обычными игроками при использовании ИИ?

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

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

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] и обсудите с ходоками!