2009-07-15 83 views
9

爲了嘗試爲我正在開發的iPhone遊戲(使用Cocos2D)創建加載欄,我想使用多線程方法。Cocos2D-iPhone中的多線程OpenGL編程

一個線程顯示加載屏幕並運行主應用程序事件循環,而新線程在後臺默默加載所有精靈(通過spriteWithFile),然後將它們添加到圖層中。

我創建一個使用NSThread的detachNewThreadSelector方法(通過performSelectorOnMainThread發送的加載狀態到主線程更新)新的線程。

我面臨的問題是,在新線程中的任何OpenGL調用(例如在spriteWithFile方法中發現的那些調用)都會因爲某種類型的BUS錯誤或內存訪問錯誤而死亡。我假設這是因爲兩個線程都試圖同時進行OpenGL調用,或者新線程不知道OpenGL上下文。

需要做些什麼來允許多線程使用Cocos2D-iPhone在iPhone上進行OpenGL調用。

回答

2

我也想這樣做。

我從this thread開始。

PS:這個答案很舊,現在我不確定異步紋理加載是否與以前一樣有用,因爲iOS5通過CVOpenGLESTextureCaches添加了「免費」紋理上傳。當然,你仍然可以(&應該)在輔助線程中加載你的資源,但現在看起來並不需要這個線程EAGLContext

+0

http://www.cocos2d-iphone.org/forum/topic/363這也有幫助。 – 2009-07-16 07:01:14

1

蘋果有一些很好的多線程OpenGL指南here

-1

Cocos2d best practices建議不要使用NSTimer,我假設這同樣適用於線程。您應該使用Cocos'Timer object。這將使線程管理離開Cocos,並且還允許您訪問正確的圖形上下文。 HTH。

3

爲了記錄在案,新線程需要執行下面兩行能夠使用OpenGL的API從併發線程:

EAGLContext *k_context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:[[[[Director sharedDirector] openGLView] context] sharegroup]] autorelease]; 
[EAGLContext setCurrentContext:k_context]; 

提供的addImageAsync方法現在這是過時通過Cocos2D 0.8.x以後的TextureMgr類,爲您進行異步紋理加載。