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

Java 在多个线程中使用相同的OpenGL上下文,java,android,c++,multithreading,opengl-es,Java,Android,C++,Multithreading,Opengl Es,我有一个单独的渲染线程,其中渲染器不断地迭代一个类似于(Java)的可绘制列表: 但它是这样写的: 为了使任何OpenGL命令都能工作,上下文必须是当前的;所有OpenGL命令都会影响当前上下文的状态。当前上下文是线程局部变量,因此单个进程可以有多个线程,每个线程都有自己的当前上下文。但是,单个上下文不能同时在多个线程中处于当前状态 那么,在同步调用时,从不同线程调用相同的OpenGL上下文安全吗?在Android(Java)上,这似乎很好,但是跨平台和/或本机代码呢?如果我开始在一个线程中调用

我有一个单独的渲染线程,其中渲染器不断地迭代一个类似于(Java)的可绘制列表:

但它是这样写的:

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


那么,在同步调用时,从不同线程调用相同的OpenGL上下文安全吗?在Android(Java)上,这似乎很好,但是跨平台和/或本机代码呢?如果我开始在一个线程中调用OpenGL,然后继续在另一个线程中调用它们,那么我是否必须在这个新线程中显式地将上下文设置为当前上下文?

将OpenGL视为一个UI线程

对OpenGL的所有命令都必须在OpenGL线程上执行

移动到上下文,所有指向OpenGL上下文的命令都必须在使用该上下文初始化的线程上执行

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


如果您真的在不同的线程上使用相同的上下文,那么无论是否同步,您都会遇到麻烦:)。

谢谢。我会考虑一个更好的实践,但是UI线程(它正在监听用户的输入)不应该和呈现线程分开吗?实际上,在线程之间迁移上下文是完全可能的,也很好。但是,执行此操作的方法取决于操作系统,并非所有语言绑定都提供此方法。
synchronized (renderingLock) {
  Iterator<DrawableObject> i = listOfDrawables.iterator();

  while (i.hasNext()) {
    draw(i.next());                          // OpenGL calls are inside
  }
}
synchronized (renderingLock) {
  unloadFromVideoMemory(someUnusedDrawable); // OpenGL calls are inside
  loadIntoVideoMemory(newDrawable);          // OpenGL calls are inside

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