近来因为开发的原因,需要在多线程下使用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