Tencent / GAutomator

Automation for mobile games
1.34k stars 382 forks source link

性能问题与NGUI控件位置获取不准 #1

Open GlodenBoy opened 7 years ago

GlodenBoy commented 7 years ago

调试的时候,手机简直是可以煎鸡蛋了。是否可以优化下发烫呢。

wukenaihe commented 7 years ago

使用的是wetest_demo还是自己的游戏?

GlodenBoy commented 7 years ago

接入的自己的游戏,可能是因为在频繁的获取控件?


另外,还有一个问题是 有些NGUI有些控件是可以直接点击的,有些控件却不行,用View看到的屏幕坐标是-20.0或者 0,这种情况一般是为啥,也没有包装过啊。

LegendKan commented 7 years ago

频繁获取控件大概有多频繁?只集成SDK,不获取控件,正常游戏会不会明显发烫?

wukenaihe commented 7 years ago

NGUI,我们会优先获取BoxColider所在的位置。BoxColider使用的是WorldToScreenPoint来获取在屏幕上的位置,返回的z坐标是个浮点数。我们SDK中设置了一个阀值,认为小于阀值的是不在摄像机内的。这个阀值可能设置有问题,属于bug,需要进行调整。

GlodenBoy commented 7 years ago

频繁获取 就是用View 去频繁 查找控件,实际上也是在频繁获取。这段时间内会烫的不行。


另外 top_activity=device.get_top_package_activity() 这个会抛出异常。

2016-12-08 15:46:46,729 - WARNING - device.py:168 - wetest - Traceback (most recent call last):
  File "D:\GAutomator-master\wpyscripts\wetest\device.py", line 165, in get_top_package_activity
    return TopActivity("", self.ui_device.info["currentPackageName"])
  File "D:\GAutomator-master\libs\uiauto\uiautomator.py", line 638, in info
    return self.server.jsonrpc.deviceInfo()
  File "D:\GAutomator-master\libs\uiauto\uiautomator.py", line 467, in wrapper
    return _JsonRPCMethod(url, method, timeout, False)(*args, **kwargs)
  File "D:\GAutomator-master\libs\uiauto\uiautomator.py", line 462, in wrapper
    return _method_obj(*args, **kwargs)
  File "D:\GAutomator-master\libs\uiauto\uiautomator.py", line 116, in __call__
    timeout=self.timeout)
  File "D:\GAutomator-master\libs\urllib3\poolmanager.py", line 248, in urlopen
    response = conn.urlopen(method, u.request_uri, **kw)
  File "D:\GAutomator-master\libs\urllib3\connectionpool.py", line 668, in urlopen
    release_conn=release_conn, **response_kw)
  File "D:\GAutomator-master\libs\urllib3\connectionpool.py", line 668, in urlopen
    release_conn=release_conn, **response_kw)
  File "D:\GAutomator-master\libs\urllib3\connectionpool.py", line 668, in urlopen
    release_conn=release_conn, **response_kw)
  File "D:\GAutomator-master\libs\urllib3\connectionpool.py", line 640, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "D:\GAutomator-master\libs\urllib3\util\retry.py", line 287, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=19008): Max retries exceeded with url: /jsonrpc/0 (Caused by ProtocolError('Connection aborted.', error(10054, '')))
GlodenBoy commented 7 years ago

这2天一直在测试,其中只有获取到坐标的NGUI可以点击,其他的image 和 lable text 一律获取不到,这些 通常有个特点就是坐标全是为0.

弹出框处理(获取可交互节点) :获取的 elements 一直为空。(可能我操作的方式不对?)

wukenaihe commented 7 years ago

弹出框处理(获取可交互节点) ,boxcolider对应的屏幕坐标获取出错了。这个接口获取的内容肯定就有问题了。这个接口还有一种情况会获取不到,NGUI的源码是修改过的。

wukenaihe commented 7 years ago

@luoxiaoji 1、获取不准的NGUI的,这个版本我还是第一次。我会立马改个版本出来,你的邮箱发我一下可否wukenaihesos@gmail.com

2、另外 top_activity=device.get_top_package_activity() 这个会抛出异常。uiautomator没起来是这种现象,adb forward失败也是这种现象。 启动uiautomator的代码为 adb shell uiautomator runtest uiautomator-stub.jar -c com.github.uiautomatorstub.Stub 如果正常启动,会在手机端启动一个监听端口 adb shell netstat |find "9008"

GlodenBoy commented 7 years ago

OK ,邮箱已发,uiautomator是没启起来,好像是和View 有冲突,我先开着那个,会占用端口,导致无法启动。

wukenaihe commented 7 years ago

@luoxiaoji UIAutomator一个手机只能起一个。起不来的原因,1、可能有其他启动了uiautomator。2、uiautomator会使用accessibilityservice这个可能被其他人占用,比如说辅助程序。还有比如说豌豆荚之类的,为了给你静默安装app,也会偷偷占用

GlodenBoy commented 7 years ago

1.刚才和我们项目组的人交流了一下,我们的NGUI是包装过的,但是没有改过源码,不知道这点是否有影响 boxcolider,但是其他的包装过的的确有大部分UI是可以获取到的。

2.test_travel() 感觉比较费啊,直接调用的话,屏幕只会点击一个固定的坐标点,其他的可获取的UI 根本不会点击,同样不知道什么原因.

wukenaihe commented 7 years ago

@luoxiaoji wetest_demo我们的确一点都没优化过。SDK性能的优化是我们一直的追求,因为性能自动化其实是手游自动化里面非常常用的一个场景。

这份是我们使用wetest_demo测试的性能消耗情况。find系列跟GameObject有直接关系

接口 引擎 通过 python性能(ms) Sdk性能(ms)
call_registered_handler UGUI 通过 21.000014 3
call_registered_handler NGUI 通过 19.99998093 1
click UGUI 通过 84.0001
click NGUI 通过 85.99996567
Click_position UGUI 通过 61.0001
Click_position NGUI 通过 65.00005722
Find_element UGUI 通过 29.99997139 0
Find_element NGUI 通过 38.00010681 1
Find_elements_path UGUI 通过 17.00000763 2-6
Find_elements_path NGUI 通过 21.19998932 2
Get_scene UGUI 通过 13.00001144 5
Get_scene NGUI 通过 15.0001049 1
Get_element_bound UGUI 通过 23.00000191 1
Get_element_bound NGUI 通过 19.99998093 2
get_element_image UGUI 通过 13.99993896 2
get_element_image NGUI 通过 13.00001144 1
get_element_text UGUI 通过 20.99990845 1
get_element_text NGUI 通过 16.99995995 1
get_registered_handlers UGUI 通过 13.00001144 1
get_registered_handlers NGUI 通过 16.99995995 5
get_sdk_version UGUI 通过 12.00008392 2
get_sdk_version NGUI 通过 15.99979401 1
get_touchable_element UGUI 通过 16.00003242 5-10
get_touchable_element NGUI 通过 19.00005341 11
get_touchable_elements_bound UGUI 通过 33.99991989 5-10
get_touchable_elements_bound NGUI 通过 32.00006485 9
get_element_world_bound UGUI 通过 16.00003242 1
get_element_world_bound NGUI 通过 46.99993134 1
input UGUI 通过 17.99988747 1
input NGUI 通过 18.00012589 0
press 2000ms UGUI 通过 2032.999992
press 2000ms NGUI 通过 2036.000013
swipe_position 2000ms UGUI 通过 2342.000191
swipe_position 2000ms NGUI 通过 2362.999916
get_component_field UGUI 通过 13.99993896 1
get_component_field NGUI 通过 16.00003242 8
find_elements_by_component UGUI 通过 10.99991798 5
find_elements_by_component NGUI 通过 27.99987793
GlodenBoy commented 7 years ago

你误会我的意思了,我是说 test_travel() 这个功能比较废, 在我们的游戏上只会一直点一个10,10的坐标点。

不知道是什么原因,无法获取到屏幕上随机的UI坐标。

另外有部分UI无法获取到坐标的问题 烦请试着优化一版发我测试一下。谢谢了。