【问题标题】:glGenTextures returns zero in background threadglGenTextures 在后台线程中返回零
【发布时间】:2010-08-12 13:06:49
【问题描述】:

我需要在 OpenGL ES 的后台线程中加载纹理。但是 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。 我应该如何在后台线程中加载纹理?

【问题讨论】:

    标签: iphone multithreading opengl-es


    【解决方案1】:

    这是一个常见错误,每个 OpenGL 上下文只能在一个线程中处于活动状态(当前),因此当您创建新线程时,它没有任何 OpenGL 上下文,并且所有 GL 调用都会失败。

    解决方案:创建另一个 OpenGL 上下文,使其在您的后台线程中处于当前状态。要加载纹理,您还希望与主上下文共享 OpenGL 名称(纹理 ID 等)。

    【讨论】:

    • 我必须使用 EAGLSharegroup?
    • 看起来,我不是 iPhone 专家,但通过谷歌搜索,我发现这是在 GL 上下文之间共享资源的句柄。
    【解决方案2】:

    在调用 OpenGL 之前,在后台线程中使用 [EAGLContext setCurrentContext:]

    EAGLContext 只能是单个线程中的当前上下文。所有 OpenGL 调用都需要当前上下文,因此需要在调用任何 OpenGL 函数之前从后台线程设置。

    请注意,EAGLContexts 不是线程安全的。

    来自 Apple 文档:

    您应该避免在多个线程上使相同的上下文成为当前的。 OpenGL ES 不提供线程安全,因此如果您想在多个线程上使用相同的上下文,您必须采用某种形式的线程同步来防止多个线程同时访问相同的上下文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-09
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多