天天看点

训练AI自动玩王者荣耀 - 收集训练数据

作者:极客天马行空

在玩游戏的过程中截屏,并记录手指操作。例如每100毫秒采集一次数据,每条记录包括屏幕截图、手指操作状态。我们希望训练好的AI能预测下一刻的手指操作状态,然后将预测的操作反映到游戏中。

手机

安卓手机,暂不考虑ios。

手机截屏

可以通过手机录屏的方式,先将游戏过程录制成视频文件,后面再从视频文件中获取截图。一般手机都自带录屏功能。还可以从电脑上录屏,例如scrcpy()。一般是录不了声音的,不过我们只用截图,所以也不用录声音。

录制手指操作

安卓上自带的工具getevent可以获取到各种输入事件,其中就包括屏幕的触摸事件。在电脑上可以用adb命令(不熟悉adb命令的话请自行搜索)调用它。

$ adb shell getevent -lp
// 输出差不多这样子
add device 6: /dev/input/event1
  name:     "hisi_gpio_key"
  events:
    KEY (0001): KEY_VOLUMEDOWN        KEY_VOLUMEUP         
  input props:
    <none>
add device 7: /dev/input/event6
  name:     "huawei,ts_kit"
  events:
    KEY (0001): KEY_F1                BTN_TOOL_FINGER       BTN_TOUCH            
    ABS (0003): ABS_MT_TOUCH_MAJOR    : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                ABS_MT_TOUCH_MINOR    : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                ABS_MT_WIDTH_MAJOR    : value 0, min 0, max 100, fuzz 0, flat 0, resolution 0
                ABS_MT_WIDTH_MINOR    : value 0, min 0, max 100, fuzz 0, flat 0, resolution 0
                ABS_MT_ORIENTATION    : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                ABS_MT_POSITION_X     : value 0, min 0, max 1080, fuzz 0, flat 0, resolution 0
                ABS_MT_POSITION_Y     : value 0, min 0, max 1920, fuzz 0, flat 0, resolution 0
                ABS_MT_TRACKING_ID    : value 0, min 0, max 15, fuzz 0, flat 0, resolution 0
                ABS_MT_PRESSURE       : value 0, min 0, max 1080, fuzz 0, flat 0, resolution 0           

“adb shell getevent -lp”可以列出所有输入设备,设备ID类似于“/dev/input/event...”。找到events中有ABS_MT开头的那个设备,它就是触摸屏啦。记录下设备ID,接着我们来获取触摸屏的事件。

$ adb shell getevent -l /dev/input/event6
// 输出差不多这样子
// type, code, value
EV_SYN       SYN_MT_REPORT        00000000            
EV_SYN       SYN_REPORT           00000000            
EV_ABS       ABS_MT_PRESSURE      00000076            
EV_ABS       ABS_MT_POSITION_X    00000249            
EV_ABS       ABS_MT_POSITION_Y    00000508            
EV_ABS       ABS_MT_TRACKING_ID   00000000            
EV_SYN       SYN_MT_REPORT        00000000            
EV_KEY       BTN_TOUCH            DOWN                
EV_SYN       SYN_REPORT           00000000            
EV_ABS       ABS_MT_PRESSURE      00000063            
EV_ABS       ABS_MT_POSITION_X    00000249            
EV_ABS       ABS_MT_POSITION_Y    00000508            
EV_ABS       ABS_MT_TRACKING_ID   00000000            
EV_SYN       SYN_MT_REPORT        00000000            
EV_SYN       SYN_REPORT           00000000                       

可以搜索多点触控协议了解上面输出的含义,例如这篇

更多记录触屏操作的代码可以参考

时间对齐

由于我们是分别录制的屏幕和触屏操作,后面处理数据的时候需要将截图和同一时刻的操作同步,所以在记录原始数据的时候尽可能带着时间戳。