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

zez*_*000 6 opengl cpu multithreading buffer swap

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

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

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

{
Draw stuff;
SwapBuffers;
Sleep(15);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

zez*_*000 1

这个问题可以简单地通过执行以下操作来解决:

glFlush();
glFinish();
Run Code Online (Sandbox Code Playgroud)

致电之前::

wglSwapBuffers(dc); // Windows
glxSwapBuffers(dc, handle); // Linux
cglFlushDrawable(ctx); // OS X
Run Code Online (Sandbox Code Playgroud)

尽管驱动程序在 Windows 上对 OpenGL 有很大影响,但 Windows 在使用 Direct3D 时仍然表现得更好。