我正在编写光线跟踪器并使用GLUT显示结果。我在子块中渲染图像,在渲染每个子块后,我更新视图。
我看到的是渲染进度,但几秒后,渲染窗口变黑,窗口标题显示为“(未响应)”。然而,renderprocess继续运行(100%cpu使用率)并在控制台输出上输出progressinfo。渲染完成后,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();
}
这个最后一个函数只有在我从mainthread调用它时才有效。通过renderthreads调用它不会更新我的窗口
答案 0 :(得分:0)
您需要做的是将所有处理放在一个单独的线程中;主GUI线程应仅用于响应GUI事件和绘制窗口,但不应进行任何密集计算。所以......在一个单独的线程中,绘制到缓冲区,然后经常在主GUI线程上安排将此缓冲区复制到UI中。