Ok, así que he estado tropezando con algunos problemas de enhebrado con OpenGL en Windows. Estoy usando C# .NET para envolver GL. Estoy en Windows7 x64.OpenGL en Windows usa Toneladas de CPU cuando se llama a SwapBuffers en RenderThread
Así que he intentado con dos pruebas diferentes. En cada prueba estoy representando un quad sin texturas (también conocido como dos triángulos). El golpe de CPU parece estar relacionado con SwapBuffers por lo que puedo decir.
prueba de un único subproceso (Esto funciona bien) ::
{
Draw stuff;
SwapBuffers;
Sleep(15);
}
prueba RenderingThread (Esto se come toda mi CPU) ::
{
Draw stuff;
SwapBuffers;
//glFinish(); //<< If used this seems to make the CPU usage normal
Sleep(15);
}
Sé que este ejemplo es simplista, pero la verdadera pregunta ¿Por qué OpenGL chupa toda mi CPU al llamar a SwapBuffers en un hilo diferente a aquel en el que se ejecuta el hilo de GUI de Windows? ¿Y por qué glFinish() parece arreglar esto? Todo el mundo dice que no debe usar glFinish, entonces no estoy seguro de lo que estoy haciendo mal o si OpenGL solo apesta a Windows ...?
Ejecuto la misma prueba en OSX, la CPU parece normal. Ejecuto la misma prueba con D3D9 & D3D10 en Windows, la CPU parece normal. No he probado en Linux ya que mi L-box está inactivo.
¿Qué estás representando? (¿Qué tan complejo es?) ¿Está encendido o apagado VSync? ¿Qué framerate recibes? – Bart
La pregunta ahora es: ¿realmente consume el tiempo de la CPU, o simplemente cae en un error de cálculo (bien conocido). Intente reemplazar ese (comentado) glFinish con un Sleep (1); si eso también reduce el consumo de CPU, es solo un error de cálculo, porque ahora, en lugar del proceso inactivo, el hilo de representación recibe todo el tiempo de CPU de repuesto. También intente iniciar algunos programas computacionales pesados y vea cómo compite con su programa. – datenwolf
Todas las cajas son 60 fps. Hmm, no estoy usando wglSwapInterval, ¿podría ser un problema en Windows? Trataré de ver qué hace eso. – zezba9000