我有一个单独的渲染线程,渲染器会不断迭代这样的抽象列表(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调用,然后继续在不同的线程中创建它们,我是否必须在这个新线程中明确地使上下文成为当前状态?
答案 0 :(得分:1)
将OpenGL视为UI线程。
所有OpenGL命令都必须在OpenGL线程上完成。
转移到上下文,所有OpenGL上下文的命令都必须在该上下文所包含的线程上完成。
考虑到您正在使用Java,本机实现很有可能为您提供某种魔力,因此您实际上并不是从不同的线程调用相同的上下文,即使它看起来像。
如果您实际上在不同的线程上使用相同的上下文,那么您将遇到麻烦,同步与否:)。