【问题标题】:rendering scene using multithreading in opengles在opengles中使用多线程渲染场景
【发布时间】:2011-03-11 06:21:13
【问题描述】:

我正在开发一个 iphone 游戏我正在使用多线程在屏幕上绘制多个对象,但我不清楚如何使用所有这些线程渲染特定场景,我是否应该在所有线程中使用相同的 FOB 来更新场景或者是否有任何其他技术可以使用多线程渲染场景。请帮助 下面给出的代码(放置在单独的线程中)给出了错误的访问权限

-(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

【问题讨论】:

    标签: iphone opengl-es


    【解决方案1】:

    帧缓冲区是一种互斥资源。如果您将帧缓冲区拆分为不同的区域,则可以进行并行访问。但是,在使用 OpenGL 进行渲染的通常情况下,您可以访问整个 Windows 帧缓冲区。因此,每个线程都必须锁定对帧缓冲区的访问——这是由驱动程序完成的。这种锁定会导致巨大的开销,从而导致严重的性能损失。或者简而言之:OpenGL 和多线程不能混合(很好)。

    你为什么要关心? GPU 将在内部并行化渲染过程,因此绝对不需要多线程访问。尤其是在 iPhone/iPad 这样的设备上,GPU 不是为多线程访问而设计的(即使它是针对不同的帧缓冲区)。

    【讨论】:

    • 但问题是,我正在对同一主线程中的游戏以及该线程中的不同渲染方法进行计算,因此我在 iphone3 中感觉到了某种延迟,但它在iphone4 :)。
    • 只要你把所有的OpenGL操作都放在一个线程中,你可以创建任意多的线程。如果多个线程同时访问一个 OpenGL 上下文,就会出现问题。
    • 但是我提到的问题是我无法从所有这些线程中组合场景,例如,如果船只在一个线程中移动而玩家正在移动另一个线程,如何将这些组合到制作一个场景
    • 通过从 OpenGL 线程中读取所有必需的变量。线程之间不是相互隔离的,因此您可以从其他线程中读取内容。但是,您当然必须正确锁定事物。无论如何:您不应该为屏幕上的每个对象生成一个线程。从技术上讲,您运行的线程数不应超过 CPU 内核数。只需循环处理所有这些元素。
    猜你喜欢
    • 2017-03-25
    • 2023-03-23
    • 2015-07-28
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多