1. 程式人生 > >cocos2dx3.4的多執行緒bug嚴重

cocos2dx3.4的多執行緒bug嚴重

這幾天發現了兩個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()函式,導致非同步執行緒無法得到通知而卡死。
呵呵