4

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

问题

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

背景

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

4

1 回答 1

5

一个 OpenGL 上下文只能在一个给定线程中是当前的(活动的)。所以要么你必须在你的线程中正确地取消绑定/重新绑定当前上下文,要么你必须使用两个上下文共享数据。我强烈建议重组你的设计,只使用一个线程进行 OpenGL 调用。更多背景信息可以在http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html找到。

于 2012-05-25T06:47:53.690 回答