在多个线程中使用相同的OpenGL上下文

时间:2014-03-22 07:40:46

标签: java android c++ multithreading opengl-es

我有一个单独的渲染线程,渲染器会不断迭代这样的抽象列表(Java):

synchronized (renderingLock) {
  Iterator<DrawableObject> i = listOfDrawables.iterator();

  while (i.hasNext()) {
    draw(i.next());                          // OpenGL calls are inside
  }
}

然后,如果在某些时候我需要更改drawables列表,我会启动一个新的线程,它会做这样的事情(简化):

synchronized (renderingLock) {
  unloadFromVideoMemory(someUnusedDrawable); // OpenGL calls are inside
  loadIntoVideoMemory(newDrawable);          // OpenGL calls are inside

  listOfDrawables.add(newDrawable);
  listOfDrawables.remove(someUnusedDrawable);
}

但它在OpenGL wiki中写道:

  

为了使任何OpenGL命令起作用,上下文必须是最新的;所有OpenGL命令都会影响当前上下文中的状态。当前上下文是一个线程局部变量,因此单个进程可以有多个线程,每个线程都有自己的当前上下文。但是,单个上下文不能同时在多个线程中是当前的。

当调用同步时,从不同的线程调用相同的OpenGL上下文是否安全?在Android(Java)上,这似乎工作得很好,但是跨平台和/或本机代码呢?如果我开始在一个线程中进行OpenGL调用,然后继续在不同的线程中创建它们,我是否必须在这个新线程中明确地使上下文成为当前状态?

1 个答案:

答案 0 :(得分:1)

将OpenGL视为UI线程。

所有OpenGL命令都必须在OpenGL线程上完成。

转移到上下文,所有OpenGL上下文的命令都必须在该上下文所包含的线程上完成。

考虑到您正在使用Java,本机实现很有可能为您提供某种魔力,因此您实际上并不是从不同的线程调用相同的上下文,即使它看起来像。

如果您实际上在不同的线程上使用相同的上下文,那么您将遇到麻烦,同步与否:)。