我一直在将核心OpenGL功能包装在Delphi VCL自定义控件中。目前,我正在使用在此控件中创建的
问题:
在线程内部使用OpenGL是否安全?我应该注意什么?我计划从此线程内外都调用OpenGL API。它本质上是一个连续的循环,在完成绘制后,它将立即开始再次绘制。目前,使用定时器取决于等待定时器间隔到达。例如,如果定时器间隔设置为100毫秒,而绘图仅需要20毫秒,则会等待80毫秒才能再次绘制。使用线程将消除此延迟。我应该如何从此线程内部进行这样的调用?
背景:
TTimer
进行循环。我强烈感觉使用计时器完全是错误的,因为绘图可能会重叠并且有延迟。相反,我想将这个绘制循环放在一个线程中。请参考我的原始问题,其中涉及闪烁问题 - 我将责任归咎于我正在使用的TTimer
。问题:
在线程内部使用OpenGL是否安全?我应该注意什么?我计划从此线程内外都调用OpenGL API。它本质上是一个连续的循环,在完成绘制后,它将立即开始再次绘制。目前,使用定时器取决于等待定时器间隔到达。例如,如果定时器间隔设置为100毫秒,而绘图仅需要20毫秒,则会等待80毫秒才能再次绘制。使用线程将消除此延迟。我应该如何从此线程内部进行这样的调用?
背景:
我基于的原始样本项目是使用应用程序的主线程进行所有API调用的,并且实际上根本不使用VCL。显示图像的窗口是使用纯Windows API调用动态创建的,并且在应用程序的主线程中从连续循环中重复绘制。这就是为什么我相信使用线程将解决我的许多问题,特别是闪烁问题。
Forms
单元,则正在使用 VCL。如果您以任何方式创建任何形式而不是直接的 WinAPI 调用(RegisterClass
和CreateWindow
),则正在使用 VCL。如果您正在使用 VCL,则从 VCL 中的线程绘制是不安全的。您原始的代码(上面链接的)引用了至少五个单元(Vcl.Graphics、Vcl.Controls、Vcl.Forms、Vcl.Dialogs、Vcl.ExtCtrls),它们都是 VCL - 请注意Vcl
命名空间。 - Ken White