2014-05-08 48 views
6

GLFW/OpenGL Pencere görülmez. ben sadece OpenGL ve çevresindeki tüm şeyler öğrenmeye başladı ediyorum gibi, bu saçma bir soru gibi gelebilir, ama neden Pencere aktif başka Pencere tarafından (görüntülenen küçültülmüş veya gizli değilken yaklaşık% 100 CPU kullanan GLFW örneği programıdır)?Yüksek CPU kullanımı Öyle OpenGL ile bir Pencere kurmak GLFW kullanıyorum

İşte ben Xcode ile Mac OS üzerinde taratıyorum, GLFW xmaple geçerli:

#include <GLFW/glfw3.h> 
int main(void) 
{ 
    GLFWwindow* window; 

    if (!glfwInit()) /* Initialize the library */ 
     return -1; 

/* Create a windowed mode window and its OpenGL context */ 
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); 
    if (!window) 
    { 
     glfwTerminate(); 
     return -1; 
    } 

/* Make the window's context current */ 
    glfwMakeContextCurrent(window); 

/* Loop until the user closes the window */ 
    while (!glfwWindowShouldClose(window)) 
    { 
     /* Render here */ 

     /* Swap front and back buffers */ 
     glfwSwapBuffers(window); 

     /* Poll for and process events */ 
     glfwPollEvents(); 
    } 

    glfwTerminate(); 
    return 0; 
} 
+0

- ölçüde çizim iplik düşürüyorlar. Genellikle yüksek kare hızlarında çizdiğinizde, bir spinlocktan daha akıllı bir şeyle yapılır, bu yüzden CPU yükünü etkili bir şekilde azaltacaktır. Süper zorlu giriş gecikme gereklilikleri olmadıkça, kareleri ekrana itebileceğinizden çok daha hızlı *** render *** yoktur. –

+0

VYSNC önerisi için teşekkürler, zaten glfwSwapInterval (1) yapıyorum, bu yeterli olduğunu düşünüyorum? –

+0

Evet, bu yeterli. Kodunuzu hiçbir yerde görmedim, bu yüzden varsayılan takas aralığını kullandığınızı varsaydım. –

cevap

10

Sizin hale döngü olursa olsun senin pencerenin hangi mimimization devlet yürütülür. Eğer oluşturmayı durdurmak isterseniz

, kendi pencere olduğunu durumunu izlemek için uygulama mantığı biraz katkıda bulunmaya çalışan gerekiyor. GLFW böylece uygulama fark edilmesini sağlayabilir kullanıcıya tanımlı glfwSetWindowIconifyCallback() ile böyle şeyler için bir geri arama destekler zaman pencere en aza indirgenir veya geri yüklenir. İşleme döngüsünü durdurmaya karar verebilir ve glfwWaitEvents()'u, kullanılabilir tüm CPU zamanını kullanmadan bir şeylerin gerçekleşmesini (pencere geri yüklenmesi gibi) beklemek için kullanabilirsiniz.

+0

Cevabınız için teşekkürler, render-döngüsümün her zaman çalıştırılması gerektiğinden, pencere görüntülenmediği sürece glfwSetWindowIconifyCallback() tam olarak aradığım şeydir. –

+1

Peki, pencere ne zaman gösterilirken küçültüldüğünde bu neden oluyor? Aynı davranışı alıyorum. Ve bu sorunun mantıklı bir açıklaması ve çözümü olmalı. – androidu

+3

OS X'te, ne 'glfwSetWindowIconifyCallback' veya' glfwGetWindowAttrib (pencere, GLFW_VISIBLE) ', pencere başka bir pencerenin arkasında olduğunda, ancak en aza indirgeniyor. Bununla birlikte, CPU kullanımı hala fırtınalar. – whoKnows

2

Belki bir şeyler yapması?

ya da kullanım "glfwWaitEvents();" "glfwPollEvents();" yerine yeni olaylar olmadığında engellemek için.

belgeleri ilk adım açıklamak: pencere kullanıcıya görünür değilse http://www.glfw.org/docs/latest/quick.html

+0

Kısa bir örnek veya başka bir açıklama ekleyebilir misiniz? –

1

NSOpenGLContext :: flushBuffer olmayan engelleme olduğu (örneğin, önünde orada başka bir pencere). glfwSwapBuffers yalnızca bu işlevi çağırdığından, bu durumda engellenmez duruma gelir. Bu durumda, Core Video display link kullanımı dışında,% 100 CPU'yu tüketmekten kaçınmak için hangi seçeneklerin olduğundan emin değilim. Buradan

: pencere gizlenmiş olduğunda https://github.com/glfw/glfw/issues/680

OS X NSOpenGL takas aralığını dikkate almaz. Bunu başka bir işletim sistemi yok. Bir noktada ekran bağlantısıyla bu konu üzerinde çalışmaya bakacağım. Bu işe yaramazsa, GLFW'nin yapabileceği bir şey olduğunu düşünmüyorum.

Bu arada, VSYNC kullanmayı düşünebilirsiniz