1、问题描述
使用MFC开发场景编辑器,基于SDI进行窗口布局,渲染窗口就是其中的中心、核心窗口(SceneView)。在SceneView的OnPaint事件中,添加渲染内容的绘制、提交。导致编辑器的其他窗口操作都无法实时刷新、总是会延时刷新或者不刷新。
2、尝试方法
2.1、渲染线程方案
将renderContext(渲染上下文)、renderEngine(渲染引擎)封装成一个RenderWindow类。SceneView中包含RenderWindow、RenderThread,单独起一个线程用于渲染。结果渲染窗口的内容无法看到,而且其他窗口的事件依然被阻塞。最后将OnPaint事件删除。
2.2、OnIdle
MFC中已经封装了OnIdle接口,当应用无任何事件时,执行OnIdle函数,完全符合渲染窗口的需求。
具体内容见:MFC OnIdle
3、解决方案
最终采用OnIdle事件,主要代码:
// MyWinApp OnIdle
POSITION pos = NULL;
if ( m_pDocManager != NULL )
pos = m_pDocManager->GetFirstDocTemplatePosition();
while ( pos != NULL )
{
CDocTemplate* pTemplate = m_pDocManager->GetNextDocTemplate(pos);
ASSERT_KINDOF( CDocTemplate, pTemplate );
pTemplate->OnIdle();
}
// MyWinAppDoc OnIdle
void MyWinAppDoc::OnIdle()
{
POSITION pos = GetFirstViewPosition();
CView *view = 0;
if (view = GetNextView(pos))
{
CTargetView *sceneView = (CTargetView*)view;
VERIFY(0 != sceneView);
sceneView->Invalidate(); // Invalidate可以是CTargetView中的任意函数,此函数中必须包含renderOneFrame()、swapBuffer()
}
}