Ogre的多线程同步支持

       近来因为开发的原因,需要在多线程下使用Ogre,就对此进行了考察,这里简单的介绍一下如何正常的编译多线程版本的Ogre。

    首先需要说明一点,Ogre对多线程的支持,其目的并不是为了提高渲染效率,毕竟对于以GPU为主的实时渲染而言,CPU负载的并行并不会带来什么实质的改善;更多的则是出于保证其在需要平衡CPU与GPU负载的多线程应用中的线程安全性考虑,比如在驱动与渲染线程间共享视点数据或对象的运动数据,以及资源的后台加载等等。所以,更确切的说,Ogre实现的线程同步,而非多线程渲染。

         Ogre可以通过多种方式实现对多线程的支持,例如通过增加Layer或插件的方式实现,具体的可以参考Jeff Andrews的《Threading the OGRE3D Render System》,而其中最直接的方法就是由Ogre Main直接实现。这里就针对这种方法,介绍一下如何在多线程下正常编译与运行Ogre应用。

    下面的步骤中

        编译器采用VS2005 sp1

        Ogre版本为1.4.6,从线程同步角度来说,它比1.4.4要稳定

        Boost版本文目前的1.34.1

   


    具体的步骤如下:


1.将OgreConfig.h中的


#ifndef OGRE_THREAD_SUPPORT

#define OGRE_THREAD_SUPPORT 1

#endif


的第二行改为1,即开启OgreMain的多线程支持功能;

 2.获取并编译boost_thread库

    由于OgreMain的多线程支持是通过boost中的thread库实现的,因此在需要相关的文件才能够正常编译Ogre SDK。相关的文件可以从http://sourceforge.net/project/showfiles.php?group_id=7586下载,解压缩后的文件夹中会包含所有需要的头文件与库文件。

 3.重新编译Ogre SDK

    在编译之前,需要设置Include的路径,保证编译器能够找到boost库的头文件。

同时要将boost_thread的静态库复制到Ogre的Dependencies目录下,具体如下:
    将boost_thread-vc80-mt-gd-1_34_1.lib,改名为libboost_thread-vc80-mt-gd-1_34_1.lib,即增加“lib”前缀,放在Ogrenew\dependencies\lib\debug目录下;
    将boost_thread-vc80-mt-1_34_1.lib,改名为libboost_thread-vc80-mt-1_34_1.lib,即增加“lib”前缀,放在Ogrenew\dependencies\lib\release目录下;

        都设置好后就可以重新编译Ogre SDK了,当然这会是一个漫长的等待过程,可以先单独编译OgreMain工程,获得必须的库文件后,在有选择的编译需要的例子,这样可以省下些时间。

 4.运行Samples

    在运行之前,需要提供boost_thread的运行期动态库,具体如下:
    将boost_thread-vc80-mt-gd-1_34_1.dll放在Ogrenew\Samples\common\bin\Debug目录下;
    将boost_thread-vc80-mt-1_34_1.dll放在Ogrenew\Samples\common\bin\Release目录下;

         由于Ogre的线程支持打开后,为了保证线程同步,实际上增加了CPU的开销,因此在运行Ogre的那些以GPU渲染为主的单线程例子时,打开多线程支持的情况下通常会导致帧速率有所下降。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rickArkin/archive/2008/01/16/2046735.aspx

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pizi0475/archive/2011/05/09/6407400.aspx

你可能感兴趣的:(线程同步)