multithreading - 从线程内执行 OpenGL 绘图

标签 multithreading delphi opengl custom-controls delphi-xe2

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

问题

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

背景

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

最佳答案

一个 OpenGL 上下文只能在一个给定线程中处于当前(事件)状态。因此,要么必须在线程中正确解除绑定(bind)/重新绑定(bind)当前上下文,要么必须使用两个上下文共享数据。我强烈建议重构您的设计,仅使用单个线程进行 OpenGL 调用。更多背景可以在 http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html 找到.

关于multithreading - 从线程内执行 OpenGL 绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10746616/

相关文章:

java - DeepLearning4j k-均值非常慢

delphi - delphi中的记事本问题

c++ - glGenBuffers 返回非唯一名称

android - Android中线程的正确使用是什么?

c++ - 两个不同的插槽调用相同的方法 - 线程安全

c# - 多线程异常和处置。为什么 Dispose 没有调用?

delphi - 如何解决打开项目时 Delphi XE 中的 bpl 加载问题?

java - Delphi Web 服务中的复杂类型

c++ - 如何创建匹配当前投影矩阵的 glClipPlanes?

java - 使用 glRotatef() 时的 OpenGL 坐标问题