OpenGL/GLFW:glfwOpenWindow 挂起(准系统应用程序)

Posted

技术标签:

【中文标题】OpenGL/GLFW:glfwOpenWindow 挂起(准系统应用程序)【英文标题】:OpenGL/GLFW: glfwOpenWindow hanging (barebones application) 【发布时间】:2012-02-11 00:13:18 【问题描述】:

好吧,我只是想用 GLFW 打开一个基本窗口,当它打开并被清除为黑色时,它挂起并出现圆形等待光标。 GUI 无法使用,整个程序冻结。

有什么帮助吗?

编辑有没有办法手动创建一个窗口并将 glfw 附加到该窗口?

代码:

// Attempt to start up GLFW
        f1("Attempting to start up GLFW");
        if(!glfwInit())
        
            e("Could not start up GLFW!");
            SetVError(V_ERR_OGL_GLFWINIT);
            return false;
        

        // Create window hints
        f1("Setting window hints");
        glfwOpenWindowHint(GLFW_FSAA_SAMPLES, V_OGL_ANTIALIAS);
        glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); // We want 4.0!
        glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
        glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

        // Create the window
        f1("Creating main window");
        if(!glfwOpenWindow(V_OGL_WINDOW_W, V_OGL_WINDOW_H, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
        
            e("Could not create main window!");
            SetVError(V_ERR_OGL_WINDOW);
            return false;
        

        // Attempt to start up Glew
        f1("Attempting to startup Glew");
        if(glewInit() != GLEW_OK)
        
            // Error and return
            e("Could not instantiate Glew!");
            SetVError(V_ERR_OGL_GLEWINIT);
            return false;
        

        // Set the window's title
        f1("Setting window title");
        glfwSetWindowTitle(V_WINDOW_TITLE);

        // Clear the screen / set BG color
        f1("Clearing background");
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        // Lastly, setup basic sticky keys
        f1("Enabling sticky keys");
        glfwEnable(GLFW_STICKY_KEYS);

主要代码:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpComString, int nShowCmd)

    // Generate logger instance (instantiate logging)
    VLogInit();

    // Log Title + Version
    i("VOGL Test "V_FULLVERSION);

    // Init OpenGL/Graphics
    if(!OGLStartup())
        return GetLastVError();
    else // Log that we succeeded
        f1("OGLStartup succeeded!");

    // Fork thread for window events
    hMainWindow = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&tcbMainWindow, NULL, 0, thMainWindow);

    // Alloc statuc
    DWORD status;

    // Wait for all threads to return
    while(true)
    
        // Main Window
        GetExitCodeThread(hMainWindow, &status);
        if(status != STILL_ACTIVE)
            break;

        // Sleep for a little bit
        Sleep(10);
    

    // All okay!
    f1("Terminating Program");
    return V_SUCCESS;


DWORD tcbMainWindow(LPVOID lpdwThreadParam)

    // Begin window loop
    do
    

     // Escape key or window closed
    while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS && glfwGetWindowParam(GLFW_OPENED));

    // Success!
    return V_SUCCESS;

是的,一切都正确记录。 http://pastebin.com/sQ2pw2wN

【问题讨论】:

你的主循环在哪里,这段代码在你的程序中能走多远?此外,GLFW 附带了许多示例;您是否考虑向其中一位学习? @NicolBolas - 添加了主代码。是的,这几乎是教程中的 c/p'd 【参考方案1】:

您必须在主循环中交换前后帧缓冲区,如下所示:

// Begin window loop
do

  glfwSwapBuffers(); // <<<
 // Escape key or window closed
while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS 
      && glfwGetWindowParam(GLFW_OPENED));

为什么会冻结?

glfw 在您调用 glfwSwapBuffers(通常)时管理操作系统事件(如刷新窗口、按下的键……)。

【讨论】:

不,这是线程问题。显然 OpenGL 不是线程安全的。幸好我现在抓住了它,因为在开发的早期,重新设计基本线程架构很容易。

以上是关于OpenGL/GLFW:glfwOpenWindow 挂起(准系统应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Opengl CORE 函数和 Comptability profile - GLFW

OpenGL/GLFW:glfwOpenWindow 挂起(准系统应用程序)

OpenGL glfw无法绘制点数

OpenGL/GLFW/GLM - 键盘输入无响应

OpenGL glfw 无法使用着色器绘制点

OpenGL/GLFW:为啥将电视用作笔记本电脑的主显示器时检测到的鼠标位置不正确?