-
Notifications
You must be signed in to change notification settings - Fork 382
GAutomator最隐藏功能 手游录制回放
GAutomator SDK在CommandHandler下有一个函数NotifyTouchElement。当开启录制模式后,会拦截用户的touch事件,并获取本次touch事件会操作的对应的GameObject。Android端的录制工具,一般只能录制touch事件。可记录控件的录制工具,一般需要通过PC端来进行录制。GAutomator的录制功能包含以下特点: 1、录制数据丰富:场景名、操作控件名、多点触控信息 2、实时:无延迟感受,可脱离PC
GAutomator记录的一次touch事件的数据格式如下所示,因为多点触控,所以同一时刻可能会存在多个touch事件:
传输的json数据如下所示:
{
"touches": [
{
"y": 288,
"deltatime": 12771616,
"relativeY": 0.266666680574417,
"relativeX": 0.173958331346512,
"phase": 2,
"x": 334,
"fingerId": 0
}
],
"scene": "main",
"name": "/Canvas/Panel/Sample"
}
录制过程无非是拦截touch事件,获取录制记录对应的数据的过程。录制过程如下所示:
- 拉起游戏开启录制功能后,等待用户操作游戏。触摸到手机屏幕后,即产生一个输入事件
- 判断输入事件阶段(begin、move、up),如果是Begin,查找操作的对应控件。
- 合并触屏操作,begin、move、up,begin事件与up事件间隔在200ms以内且begin、move、up的坐标均在50pix以内的合并为一个click事件。begin、move、up,begin事件与up事件间隔大于200ms且begin、move、up的坐标均在50pix以内的合并为一个press事件。其他的,采样move合并为一个swipe事件。(该部分工具目前交由PC端完成)
- 获取游戏场景,发送至录制工具
- 如果录制为结束,游戏未退出返回1。否则结束录制。
提供了录制回放的python demo,record.py中包含记录
import wpyscripts.manager as manager
class Record(object):
ENTER_RECORD = 500
LEAVE_RECORD = 501
def __init__(self,path):
self.engine = manager.get_engine()
self.socket = self.engine.socket
self.record_file=open(path,"w")
def send_record(self):
self.socket.send_command(Record.ENTER_RECORD)
def format_touches(self,touches):
t_str=[]
for touch in touches:
str="{{phase:{phase},fingerid:{fingerId},x:{x},y:{y},relativeX:{relativeX},relativeY:{relativeY},deltatime:{deltatime}}}".format(**touch)
t_str.append(str)
res=",".join(t_str)
return res
def format_record(self, record):
touches_str=self.format_touches(record["touches"])
record_str="{0},{1},[{2}]\n".format(record["scene"],record["name"],touches_str)
return record_str
def recv_record(self):
self.socket.socket.settimeout(None)
while True:
record = self.socket._recv_data()
print record
record_str=self.format_record(record)
#print record_str
self.record_file.write(record_str)
self.record_file.flush()
if __name__ == '__main__':
record = Record("record1.txt")
record.send_record()
record.recv_record()
根据录制内容进行回放可以有很多种算法,这里讲述其中一种方法。主要利用GAutomator提供的get_touchable_elements_bound接口,获取当前游戏界面的场景名称,可操作控件来选择放回内容。 录制记录的touch时间中包含,deltatime游戏开始到现在的时长,touch事件只包括down与up。录制的记录较为原子,所以在回放之前可以对这部分录制记录进行预处理,进行转换(event.py中的RecorderParser)
回放过程。获取当前游戏的包名、场景名称、可操作控件集合,根据一定的策略进行回放操作。以往的回放只根据录制的操作序列,该算法以最优匹配作为回放策略,能够极大概率跳过弹出框等异常情况继续执行回放操作。回放的策略如下图所示,相关代码(play_back.py,decision_tree.py):
下载附件中的GAutomator,包含一个autotest的文件即为录制回放相关的内容。可利用sample下的wetest_demo.apk进行录制回放的尝试。 录制步骤: step 1:拉起集成SDK的游戏 step 2:设置录制的文件名称,在record.py的Record类的初始化参数 step 3:运行record.py step 4:玩游戏进行录制(轻适当放慢操作)
回放过程: step 1:拉起游戏 step 2:设置好录制记录文件,在play_back.py中 step 3:运行play_back.py,直接进行回放