Ogre中如何打开资源后台加载

  1. 打开资源后台加载。打开文件“OgreBuildSettings.h”,将里面的OGRE_THREAD_SUPPORT改为2OGRE_THREAD_PROVIDER改为1OGRE_USE_BOOST不改好像没事)。在VS2008的工具菜单中添加boost 1.52的头文件和库文件路径。这样,引擎已经支持了后台加载。

  2. 在引擎支持了后台加载后,还需要将应用程序改成使用后台加载。在SampleBrowser.h中将两处“Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("");”调用替换成“Ogre::ResourceBackgroundQueue::getSingleton().initialiseResourceGroup("");”。运行后会崩溃在“mTrayMgr= new SdkTrayManager("BrowserControls", mWindow, mMouse, this);”,因为这里需要依赖资源,而资源还在后台加载中。这个问题可以使用加载监听器来解决,在完成后再继续主线程中的运行,如果为了省力可以使用Sleep5-15秒钟,不同机器初始化的时间不一样。监听器的简单做法:自己写一个类继承自ResourceBackgroundQueue::Listener,这个类维护一个多线程同步对象(MutexEventSemaphore等等),主线程调用完“Ogre::ResourceBackgroundQueue::getSingleton().initialiseResourceGroup("");”马上等待多线程同步对象。资源线程完成资源加载后会例行调用ResourceBackgroundQueue::Listener::operationCompleted(),在这个函数里改变多线程同步对象的状态,这样主线程就会继续执行了。

  3. ResourceGroupManager类中对外暴露的资源操作接口在ResourceBackgroundQueue里面都有对应的,调用后者可以以异步加载的方式记载资源,当然需要传入监听器。不过应该改造ResourceBackgroundQueue中的函数,Ogre的做法是通过宏来控制流程的,应该改成如果传入Listener指针就按照异步加载,传空指针就同步加载,这样就能够随时改变资源加载的方式,因为有时候确实需要同步加载资源。还有个隐患,由于监听器对象可能是个逻辑对象,而这个对象可能在资源加载过程中析构掉了,会引起野指针异常,应该传入监听器的智能指针。

猜你喜欢

转载自blog.csdn.net/CrazyEngine/article/details/52883603