2011-05-14 9 views
6

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.

+0

¿Qué estás representando? (¿Qué tan complejo es?) ¿Está encendido o apagado VSync? ¿Qué framerate recibes? – Bart

+0

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

+0

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

Respuesta

1

Este problema se soluciona simplemente haciendo:

glFlush(); 
glFinish(); 

Antes de llamar ::

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

Aunque los conductores hacer una gran diferencia con OpenGL en Windows, y Windows todavía funciona mucho mejor con Direct3D.

+0

Es extremadamente dependiente del controlador en cualquier sistema, * particularmente * con OpenGL involucrado, ya que el hardware y, a menudo, el soporte del controlador para esa API puede ser pésimo, emulado o traducido a las instrucciones D3D para el hardware. – ssube

+0

Como he visto, esto parece ser muy cierto. Es por eso que usar D3D en Windows es imprescindible si te preocupa el rendimiento. – zezba9000

Cuestiones relacionadas