2014-05-25 8 views
5

Ich arbeite an einer GLFW-Anwendung und ich bemerkte ein Problem bei der Größenänderung des Fensters.GLFW Umfrage wartet, bis die Fenstergröße geändert wurde.

Während der Benutzer das Fenster skaliert, die glfwPollEvents() Funktion wartet, bis der Benutzer beendet. Dies bedeutet, dass während der Skalierung des Fensters die Renderfunktion nicht aufgerufen wird und schreckliche Artefakte erzeugt werden.

Ich habe um das funktionierte durch die Render-Funktion aus der Hauptschleife sowie die Größe des Fensters Rückruf Aufruf:

#include <GLFW/glfw3.h> 

static void render(GLFWwindow* window) { 
    glfwMakeContextCurrent(window); 

    glClear(GL_COLOR_BUFFER_BIT); 

    glfwSwapBuffers(window); 
} 

static void window_size_callback(GLFWwindow* window, int width, int height) { 
    render(window); 
    glViewport(0, 0, width, height); 
} 

int main(void) { 
    if (!glfwInit()) { 
     return -1; 
    } 

    GLFWwindow* window = glfwCreateWindow(640, 480, "Terrain chunk render", NULL, NULL); 
    if (!window) { 
     glfwTerminate(); 
     return -1; 
    } 

    glfwSetWindowSizeCallback(window, window_size_callback); 

    while (!glfwWindowShouldClose(window)) { 
     render(window); 
     glfwPollEvents(); 
    } 

    glfwTerminate(); 
    return 0; 
} 

Dies bedeutet jedoch, dass die Funktion machen wird nicht aufgerufen, wenn der Benutzer Halten Sie die Maustaste gedrückt, nachdem Sie das Fenster skaliert haben, ohne es tatsächlich zu bewegen. Gibt es eine effiziente Möglichkeit, dies zu umgehen und die Renderfunktion konsistenter zu nennen?

+0

Ich bin nicht wirklich sicher, aber haben Sie die Windows-Systemeinstellungen überprüft? Wenn nicht, könnten Sie unter Windows 7 versuchen, [this] (http://answers.microsoft.com/en-us/windows/forum/windows_7-desktop/in-windows-7-how-do-i-show- window-contents-while/18e3aee2-bcc7-4005-a45d-c5613cf6eb3c) wie vorgeschlagen und sehen, wie es geht. – Keugyeol

Antwort

0

Sie sollen die glfwSetWindowSizeCallback(window, window_size_callback); in der while-Schleife bewegen, so dass die Render-Funktion aufgerufen wird, während Sie das Fenster wieder Sizing werden. Ich hatte das gleiche Problem vor langer Zeit.

Edit: Es wird empfohlen, nicht Rückrufe in der Schleife einzustellen. Die Frames müssen nur neu gezeichnet werden, während das Fenster in der Größe geändert wird.

+0

Was würde das bedeuten? Callback für jeden Frame zurücksetzen? Hört sich auf den ersten Blick falsch an – Grief

+1

Danke, dass Sie darauf hingewiesen haben. Scheint, ich habe nicht wirklich verstanden, was ich zu der Zeit tat. – Polar1ty

2

Verwenden zwei Threads, ein für Wahlveranstaltungen und ein für das Rendern. Sie können auch glfwWaitEvents anstelle von glfwPollEvents verwenden, um den Ereignisthread zu blockieren, bis Ereignisse verfügbar sind.