cocos2dx3.4的多线程bug严重

时间:2023-02-08 18:27:17
这几天发现了两个bug,都是多线程的。

1。视频播放器中android方面,Cocos2dxVideoHelper中虽然用了Handler保证播放指令在主线程UI中顺序异步执行,但是还有个问题,就是_createVideoView的时候,有时候主线程方面先进入Cocos2dxVideoView的onMeasure方法,导致设置Cocos2dxVideoView的宽度和高度为0,Cocos2dxVideoView不显示,后来虽然在2dx线程中有设置Cocos2dxVideoView宽度和高度,但是已经没有用了,因为不显示,所以surfaceCreated()方法不执行,播放器不能初始化,播放不了视频。此时解决的方法是在Cocos2dxVideoView的setVideoRect()方法中执行

requestLayout();
        invalidate();

来重新布局,激活surfaceCreated()方法。

2。异步加载图片资源卡死问题。
  异步加载中,当加载完一张图片,再加载下一张,通过回调再来加载下一张。具体使用到的函数是
Director::getInstance()->getTextureCache()->addImageAsync(texturePath.c_str(), CC_CALLBACK_1(DNLoadingLayer::loadCallBack, this));
在addImageAsync中有_sleepCondition.notify_one()通知异步线程加载。
异步线程中如果没有加载任务,则进入_sleepCondition.wait等待函数。
理论上顺序是这样的,加载完一张图片后,异步线程中则快速进入_sleepCondition.wait等待函数,但是有时候,几率很小,异步线程并没有那么快,主线程则快速发送一个异步加载指令,首先调用了_sleepCondition.notify_one()函数,导致异步线程无法得到通知而卡死。
呵呵