Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:openGL:JOGL:当我调用display()方法时,幕后会发生什么?_Java_Opengl_Jogl - Fatal编程技术网

Java:openGL:JOGL:当我调用display()方法时,幕后会发生什么?

Java:openGL:JOGL:当我调用display()方法时,幕后会发生什么?,java,opengl,jogl,Java,Opengl,Jogl,我有一行代码: renderableObject.renderObject(gl, glu); 这将导致openGL呈现大量对象,但它仅在按如下方式使用时才起作用: @Override public void display(GLAutoDrawable drawable) { renderableObject.renderObject(gl, glu); } 如果在重写的display方法之外调用该行,我会得到一个异常,表示当前

我有一行代码:

renderableObject.renderObject(gl, glu);
这将导致openGL呈现大量对象,但它仅在按如下方式使用时才起作用:

@Override
public void display(GLAutoDrawable drawable)
    {               
        renderableObject.renderObject(gl, glu);
    }
如果在重写的display方法之外调用该行,我会得到一个异常,表示当前线程上没有glContext,实际上,如果在该方法之外调用任何gl draw命令,我会得到相同的异常

现在,理想情况下,我希望创建一次大量的显示列表,然后使用定期重新创建的奇数显示列表在每一帧渲染它们。但是我必须通过这个single display()方法,这意味着如果显示列表已经创建,或者需要更改,我必须测试每一帧。。。每秒60次!如果我可以在需要的时候单独处理它们,这是多么浪费处理能力啊

因此,无论调用display()方法做什么,我都希望能够复制它,允许我创建大量自己的自定义显示方法,而无需对所有内容都使用这个方法


那么,我能自己打个简单的gl电话吗?

虽然看起来很奇怪,但这是它应该工作的方式


幕后正在发生的事情是,当您创建的GLCanvas开始绘制时,幕后JOGL正在做一大堆工作。它正在创建一个GLContext,并使其成为当前线程的GLCanvas的当前内容。只有完成此操作后,才能进行渲染调用。未设置为当前的GLContext或从其派生的GL对象对您没有任何用处。此外,GLContext仅针对该线程设置为当前,并且在显示调用完成后立即设置为非当前,因此挂起对它的引用或GL供以后使用将不起作用

几乎所有JOGL应用程序都是这样工作的。创建一个GLEventListener,并在其中实现display(),从GLAutoDrawable中提取一个GL,并使用它进行渲染调用。您不希望在任何其他位置进行渲染调用,就像您不希望在paint()方法之外进行Graphics2D调用一样。大多数Java初学者尝试从外部绘制方法;这是相似的。如果您需要触发重新绘制,那么可以使用与Java2D相同的方法:使用invalidate()。(当然,您可以编写从display()方法调用的子方法,并将GL或GLAutoDrawable作为参数)


有一些方法可以专门创建一个GLContext并使其成为当前的,但它们很少是必需的。在这里使用这种方法几乎总是更好。

在幕后,JOGL正在做一大堆工作。它正在创建一个GLContext,并使其成为当前线程的GLCanvas的当前我不能自己做吗?塞巴斯蒂安·特洛伊,你可以,但它所做的并不是很琐碎。您可以执行严格的最小操作(从GLAutoDrawable获取GLContext并使其成为当前的),但请记住,JOGL包含大量的好的怪癖和解决方法,这些怪癖和解决方法比C中的原生普通OpenGL或Java、C#、Python中的另一个绑定安全得多。。。此外,如果你做了坏事,很容易毁掉你的表现。当我将Ardor3D移植到JOGL 2时,我发现有一次对makeCurrent()的调用是无用的,当v-sync关闭时,删除这个调用给了我巨大的提升。