【问题标题】:GLUT window turns black "(not responding)" when CPU is busyCPU 忙时,GLUT 窗口变黑“(无响应)”
【发布时间】:2010-11-01 01:17:10
【问题描述】:

我正在编写一个光线追踪器并使用 GLUT 来显示结果。我在子块中渲染图像,并在渲染每个子块后更新视图。

发生的情况是我看到了渲染进度,但几秒钟后,渲染窗口变黑并且窗口标题显示“(未响应)”。然而,渲染进程继续运行(以 100% cpu 使用率)并在控制台输出上输出进度信息。渲染完成后,GLUT 窗口将恢复正常并显示图像。

如何才能在渲染过程中保持窗口响应,使其不会变黑?

谢谢!

//编辑:我在等待渲染线程时显然阻塞了我的主线程:

while(true){
    if(m_activeRenderThreads==0)
        break;
    ::WaitForSingleObject(updateEvent->m_hObject, 200);
    notifyObservers(); //inherited from IFunctionObservable
}

notifyObservers() 调用:

update(){
    glClear(GL_COLOR_BUFFER_BIT);
    glViewport(0,0,resX,resY);
    glRasterPos2i(-1,-1);
    glDrawPixels(resX, resY, GL_RGB, GL_FLOAT, renderBuffer);
    glutSwapBuffers();
}

只有当我从主线程调用它时,最后一个函数才有效。通过渲染线程调用它不会更新我的窗口

【问题讨论】:

    标签: glut cpu-usage


    【解决方案1】:

    您需要做的是将所有处理放在一个单独的线程中;主 GUI 线程应该只用于响应 GUI 事件和绘制窗口,而不应该做任何密集的计算。所以...在一个单独的线程中,绘制到一个缓冲区,然后您应该每隔一段时间就安排在主 GUI 线程上将该缓冲区复制到 UI 中。

    【讨论】:

    • 这就是我所做的。开始渲染时,我创建了 n 个新线程(n=#of cpu's)并仅在这些线程中进行光线跟踪
    • 我想我找到了问题所在。我正在使用 MFC 创建我的渲染线程。在主线程中,我在 while 循环(见上文)中等待这些线程通知我他们完成了渲染的子区域并更新 GLUT 窗口。我不知道如何使用主线程以外的另一个线程更新 GLUT 窗口
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多