2011-03-11 41 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