2010-08-12 34 views
6

我需要在OpenGL ES的後臺線程中加載紋理。但在後臺線程中調用glGenTextures時總是返回零。glGenTextures在後臺線程中返回零

-(void) someMethodInMainThread { 
    [self performSelectorInBackground:@selector(load) withObject:nil]; 
} 

-(void) load { 
    GLuint textureID = 0; 
    glGenTextures(1, &textureID);   
} 

textureID爲零。 如果我將代碼更改爲[self performSelector:@selector(tmp)withObject:nil];它會正常工作,並返回1. 我應該如何加載後臺線程紋理?

回答

9

這是一個常見錯誤,每個OpenGL上下文只能在一個線程中處於活動狀態(當前),因此當您創建新線程時,它不具有任何OpenGL上下文,並且所有GL調用都會失敗。

解決方案:創建另一個OpenGL上下文,使其在後臺線程中處於當前狀態。要加載紋理,您還希望與主要上下文共享OpenGL名稱(紋理ID等)。

+0

我必須使用EAGLSharegroup? – Division 2010-08-12 13:48:13

+0

看起來像,我不是iPhone的專家,但通過谷歌搜索,我看到這是在GL環境之間共享資源的句柄。 – 2010-08-12 13:55:43

-1

在調用OpenGL之前,在後臺線程中使用[EAGLContext setCurrentContext:]

EAGLContext只能是單個線程中的當前上下文。所有OpenGL調用都需要當前上下文,因此需要在調用任何OpenGL函數之前從後臺線程設置。

請注意,EAGLContexts是而不是線程安全。

從Apple DOC:

應該避免使多個線程在同一背景下的電流。 OpenGL ES不提供線程安全性,因此如果要在多個線程上使用相同的上下文,則必須採用某種形式的線程同步來防止從多個線程同時訪問相同的上下文。