工作中遇到在quick cocos2dx 3.5中做下图.1示方式布局复杂UI时,在处理Touch时会疯狂掉帧,掉帧状况如图.2
图.2 掉帧状况
对比Touch和None-Touch时渲染状况,除了fps疯狂下降,其它都正常,并且结束Touch马上恢复正常,因此猜测不是Render卡住了,测试了图.3方式的布局,也不会发生掉帧现象,因此更可排除Render卡。但是还不能判断出具体是哪里卡,因此在mainloop处,各模块入口分别加时间打印(如updata,dispatchingEvent),一步步加打印跟踪,发现问题在LuaTouchEventManager::dispatchingTouchEventReal这个方法。
图.3 不卡帧布局方式
图.4 为LuaTouchEventManager::dispatchingTouchEventReal方法部分截图,卡住的便在红框部分,cocos添加了TouchCapture事件,在dispatchingTouchEvent时,会先获取到被Touch节点的所有祖宗节点(依次取父节点,父节点的父节点…,直至顶层节点),然后将TouchCapture按从最上层父节点依次往下顺序分发出去,全局搜素了cc.NODE_TOUCH_CAPTURE_EVENT这个事件,发现只是在UIScrollView中使用了,并且没做耗时操作,看到这里按理也没多做太多事情,也不至于卡帧,联想到NodeEx的EventDispatcher会再做一次事件分发,通过打印堆栈(图.5)证实UIScrollview的Touch_Capture也确实是NodeEx分发过来的。
图.4
图.5
继续跟NodeEx.lua的Node:EventDispatcher函数(图.6)打印#listener一般不大,具体时间消耗在哪也就不明确了,通过ProFi这个工具发现Node:EventDispatcher这个函数调用频率异常的高,可能这就是卡帧的具体原因了。
图.6
不明白的是 cc.NODE_TOUCH_CAPTURE_EVENT 这个事件的作用是什么?可以说目前并没有使用到,UIScrollView中的处理如图.7。
图.7 UIScrollView中TOUCH_CAPTURE处理