在RenderThread上调用SwapBuffers时,Windows上的OpenGL使用Tons of CPU

时间:2011-05-14 03:04:56

标签: multithreading opengl cpu swap buffer

好的,所以我在Windows上遇到了一些OpenGL的线程问题。我正在使用C#.NET来封装GL。我在Windows7 x64上。

所以我尝试了两种不同的测试。在每个测试中,我渲染一个无纹理的四边形(又称两个三角形)。从我能说的话来看,CPU命中似乎与SwapBuffers有关。

单线程测试(这很好)::

{
Draw stuff;
SwapBuffers;
Sleep(15);
}

RenderingThread测试(这吃了我所有的CPU)::

{
Draw stuff;
SwapBuffers;
//glFinish(); //<< If used this seems to make the CPU usage normal
Sleep(15);
}

我知道这个例子很简单,但真正的问题是为什么OpenGL在不同的线程上调用SwapBuffers时会占用我的所有CPU,而不是Windows GUI线程运行的线程?为什么glFinish()似乎解决了这个问题?每个人都说不要使用glFinish,所以我不确定我做错了什么,或者OpenGL只是在Windows上糟透了......?

我在OSX上运行相同的测试,CPU似乎正常。我用D3D9&amp;运行相同的测试。在Windows上D3D10,CPU似乎正常。没有在Linux上进行测试,因为我的L-box已关闭。

1 个答案:

答案 0 :(得分:1)

这个问题可以通过以下方式解决:

glFlush();
glFinish();

在致电::

之前
wglSwapBuffers(dc); // Windows
glxSwapBuffers(dc, handle); // Linux
cglFlushDrawable(ctx); // OS X

虽然驱动程序在Windows上与OpenGL有很大不同,但Windows在Direct3D上的表现仍然要好得多。