Ogre线程渲染,渲染设备无法恢复窗口停止响应的案例及解决办法

在使用Ogre进行多线程渲染时,窗口大小调整触发的设备重置可能导致渲染崩溃。问题源于非主线程调用D3D9Device::reset()失败。解决方案是通过在主线程监听窗口Resize事件,暂停渲染线程,由主线程执行一帧渲染以正确重置设备。进一步研究发现,必须在创建渲染设备的线程中进行reset操作。通过同步机制确保在渲染线程中创建并初始化RenderWindow,成功解决了问题。
摘要由CSDN通过智能技术生成

问题比较简单:

我在主线程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()
{
//暂停渲染

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值