2014-05-08 54 views
6

我使用GLFW,因此使用OpenGL設置窗口。因爲我剛剛開始學習OpenGL及其周圍的所有東西,這可能聽起來像一個愚蠢的問題,但爲什麼GLFW的示例程序在窗口未被主動顯示時使用接近100%的CPU(被另一個窗口最小化或隱藏)?當GLFW/OpenGL窗口不可見時,CPU使用率過高

這裏是GLFW〔實施例,我和Xcode運行它在Mac OS:

#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

順便說一下,您可能會考慮使用VSYNC--這會大大地節制您的繪圖線程。通常,當您以高幀速率繪製時,它會比螺旋鎖更智能,這樣可以有效減少CPU負載。除非您有超高要求的輸入延遲要求,否則渲染***的速度並不快得多。 –

+0

感謝VYSNC的建議,我已經在做glfwSwapInterval(1),我認爲這就夠了? –

+0

是的,這就夠了。我沒有在任何地方看到你的代碼,所以我認爲你使用的是默認的交換時間間隔。 –

回答

10

渲染循環,無論是你的窗口mimimization狀態下執行。

如果要停止渲染,你必須enhace應用邏輯有點來跟蹤你的窗口的狀態。GLFW支持用戶自定義這樣的事情glfwSetWindowIconifyCallback() 回調使應用程序可以讓別人注意到當窗口被最小化或恢復。您可以決定停止渲染循環,並可以使用glfwWaitEvents()等待發生某些事情(如正在恢復的窗口),而不使用所有可用的CPU時間。

+0

感謝您的回答,因爲我的渲染循環需要一直運行,除非窗口不顯示時,glfwSetWindowIconifyCallback()正是我所搜索的內容。 –

+1

但是,爲什麼在最小化時發生這種情況,而不是在顯示窗口時發生?我得到相同的行爲。這個問題必須有一個合理的解釋和解決方案。 – androidu

+3

在OS X中,當窗口位於另一個窗口的後面時,'glfwSetWindowIconifyCallback'或'glfwGetWindowAttrib(window,GLFW_VISIBLE)'都不起作用,但未被最小化。但是,CPU使用率仍然飆升。 – whoKnows

2

也許開始做點什麼?

或使用「glfwWaitEvents();」而不是「glfwPollEvents();」在沒有新事件時阻止。

的文檔解釋它在第一步:http://www.glfw.org/docs/latest/quick.html

+0

您可以添加一個簡短的例子或進一步的解釋嗎? –

1

NSOpenGLContext :: flushBuffer是非阻塞如果窗口是對用戶不可見的(例如,在它的前面有另一個窗口)。 因爲glfwSwapBuffers確實調用了這個函數,所以在這種情況下它變成了非阻塞。 我不確定在這種情況下我們必須避免使用100%的CPU,除非使用Core Video display link

從這裏:https://github.com/glfw/glfw/issues/680

OS X忽略NSOpenGL交換間隔時被遮蔽的窗口。沒有其他操作系統這樣做。 我會考慮在某些時候用顯示鏈接來解決這個問題。如果這不起作用,我認爲GLFW可以做任何事情。