【cocos2dx】quick cocos2dx 3.5 节点层级太深就会就开始卡

工作中遇到在quick cocos2dx 3.5中做下图.1示方式布局复杂UI时,在处理Touch时会疯狂掉帧,掉帧状况如图.2


图.1 UI布局方式


图.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处理


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值