问题
I've been wrapping the core OpenGL functionality within a Delphi VCL custom control. Currently, I am doing a loop using a TTimer
created within this control. I strongly feel using a timer is completely wrong, as drawing could both overlap and have delays. Instead, I would like to put this drawing loop within a thread. Please refer to my original question with some issues of flickering - which I'm putting the blame on the TTimer
which I'm using.
Question
Is OpenGL safe to use inside of a thread? What should I be aware of? I plan on making OpenGL API calls from both inside and outside of this thread. It will essentially be a continuous loop, where as soon as it's finished drawing, it will immediately start drawing again. Currently, using a Timer, it depends on waiting for the Timer's interval to be reached. So, for example, if the Timer's interval is set to 100 msec, and the drawing only takes 20 msec, then there will be 80 msec of waiting until it draws again. Using a thread will eliminate this delay. How should I make such calls from inside this thread?
Background
The original sample project which I based all of my API calls off of was using the application's main thread, and in fact used absolutely no VCL at all. The Window which displayed the image was dynamically created using pure Windows API calls, and the drawing was repeated from within a continuous loop in the application's main thread. This is why I believe using a Thread will solve many of my issues - specifically the flickering.
回答1:
One OpenGL context can only be current (active) in one given thread. So either you have to unbind/rebind the current context correctly in your threads, or you have to use two context sharing data. I strongly recommend to restructure your design to only use a single thread doing OpenGL call. More background can be found at http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html.
来源:https://stackoverflow.com/questions/10746616/performing-opengl-drawing-from-within-a-thread