问题比较简单:
我在主线程Main中创建了WIN32窗口,并初始化好了Ogre相关资源。独立开启一个线程Render进行Ogre的渲染以及场景挂接、移除等渲染循环操作。
正常情况下不会有任何问题,但是一旦我们改变了WIN32窗口的大小时,这时候会触发Ogre重置渲染设备,但是重置失败了,渲染循环也就崩溃了....
跟着Ogre源代码到,bool D3D9Device::reset()里面发现是调用hr = mDevice->Reset(mPresentationParams);时返回了一个错误的值,也就是说在非创建窗口消息循环的线程调用void WorkSearchContext::Reset(VirtualProcessor *pVirtualProcessor, Algorithm algorithm)时没有正常执行(这里有位是Release也就没有深入跟踪调试)
试过很多种改变窗口style和styleEx的方法,都没用。这里还要说明一下,使用FireBreath控件封装好的WIN32窗口不存在之类的问题,这说明问题原因不是出自Ogre本身渲染部分,而是WIN32窗口默认不支持在其他线程修改渲染设备(个人猜测)。
至于具体解决方案,暂时还没有找到,这里记录一下问题!
2013.11.21 15:37 临时解决办法
void RenderWindow::WindowMoveOrResize()
{
//暂停渲染