天天看點

訓練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                       

可以搜尋多點觸控協定了解上面輸出的含義,例如這篇

更多記錄觸屏操作的代碼可以參考

時間對齊

由于我們是分别錄制的螢幕和觸屏操作,後面處理資料的時候需要将截圖和同一時刻的操作同步,是以在記錄原始資料的時候盡可能帶着時間戳。