2011-03-11 40 views
0

我正在開發一個iphone遊戲我使用多線程在屏幕上繪製多個對象,但我不清楚如何使用所有這些線程渲染特定的場景,我應該使用相同的FOB所有的線程來更新場景或有任何其他技術進行渲染使用多線程。請幫助下面給出 碼現場(在單獨的線程放置)給出了不良ACCES在opengles中使用多線程渲染場景

-(void)drawBricks1{ 

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

[EAGLContext setCurrentContext:context]; 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 

//glViewport(0, 0,backingWidth, backingHeight); 
Image *ii=[[Image alloc]initWithImage:[UIImage imageNamed:@"s_2.png"]]; 
[ii renderAtPoint:CGPointMake(100, 100) centerOfImage:YES]; 
// Clear screen 
//glClear(GL_COLOR_BUFFER_BIT); 

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 


[context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
[pool release]; 

}// end of the drawb 

回答

1

幀緩衝器是一個multually EXLUSIVE資源。如果你想將幀緩衝區分成不同的區域,可以進行並行訪問。然而,在使用OpenGL進行渲染的通常情況下,您可以訪問整個窗口幀緩衝區。因此每個線程都必須鎖定對幀緩衝區的訪問 - 這是由驅動程序完成的。這種鎖定會導致巨大的開銷,導致嚴重的性能下降。或者用幾句話來說:OpenGL和多線程不會混合(良好)。

任何你爲什麼關心呢? GPU將在內部並行渲染過程,因此絕對不需要多線程訪問。特別是在像iPhone/iPad這樣的設備上,GPU不是爲多線程訪問而設計的(即使它是針對不同的幀緩衝區)。

+0

但問題是,我做的計算就在同一個主線程遊戲和在該線程中也有不同的渲染方法,因爲這個我砍伐某種在iPhone3的延遲,但它在iPhone4的:)工作正常。 – Ali 2011-03-11 14:40:59

+0

只要你在一個線程中保留所有的OpenGL操作,你就可以創建你喜歡的線程。如果多個線程同時訪問一個OpenGL上下文,問題就開始了。 – datenwolf 2011-03-11 14:48:44

+0

後來我提到的問題是,我不能夠,如果船舶在一個線程中移動和球員的移動的其他線程現場從所有這些線程結合起來,例如,如何將這些結合起來,使一個場景 – Ali 2011-03-11 14:57:52