从线程内执行OpenGL绘图

时间:2012-05-24 23:19:39

标签: multithreading delphi opengl custom-controls delphi-xe2

我一直在Delphi VCL自定义控件中包装核心OpenGL功能。目前,我正在使用此控件中创建的TTimer进行循环。我强烈认为使用计时器是完全错误的,因为绘图可能重叠并且有延迟。相反,我想把这个绘图循环放在一个线程中。请参考我的original question中的一些闪烁问题 - 我将责任归咎于我正在使用的TTimer

问题

OpenGL在线程内部使用是否安全?我应该注意什么?我打算从这个线程的内部和外部进行OpenGL API调用。它基本上是一个连续的循环,一旦完成绘制,它将立即开始绘制。目前,使用定时器,它取决于等待达到定时器的间隔。因此,例如,如果Timer的间隔设置为100毫秒,并且绘图仅需要20毫秒,那么将等待80毫秒,直到它再次绘制。使用线程将消除此延迟。我应该如何从这个线程中进行这样的调用?

背景

我基于所有API调用的原始示例项目是使用应用程序的主线程,实际上根本没有使用VCL。显示图像的窗口是使用纯Windows API调用动态创建的,并且从应用程序主线程中的连续循环内重复绘制。这就是为什么我相信使用Thread会解决我的许多问题 - 特别是闪烁。

1 个答案:

答案 0 :(得分:5)

一个OpenGL上下文只能在一个给定的线程中是当前的(活动的)。因此,您必须在线程中正确解除绑定/重新绑定当前上下文,或者必须使用两个上下文共享数据。我强烈建议将您的设计重组为仅使用单个线程进行OpenGL调用。更多背景信息可在http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html找到。