在玩遊戲的過程中截屏,并記錄手指操作。例如每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
可以搜尋多點觸控協定了解上面輸出的含義,例如這篇
更多記錄觸屏操作的代碼可以參考
時間對齊
由于我們是分别錄制的螢幕和觸屏操作,後面處理資料的時候需要将截圖和同一時刻的操作同步,是以在記錄原始資料的時候盡可能帶着時間戳。