Ogre的多執行緒同步支援

2021-05-25 06:52:02 字數 1523 閱讀 8874

近來因為開發的原因,需要在多執行緒下使用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庫

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渲染為主的單執行緒例子時,開啟多執行緒支援的情況下通常會導致幀速率有所下降。

Ogre的多執行緒同步支援

近來因為開發的原因,需要在多執行緒下使用ogre,就對此進行了考察,這裡簡單的介紹一下如何正常的編譯多執行緒版本的ogre。首先需要說明一點,ogre 對多執行緒的支援,其目的並不是為了提高渲染效率,畢竟對於以 gpu為主的實時渲染而言,cpu負載的並行並不會帶來什麼實質的改善 更多的則是出於保證其...

Ogre的多執行緒

以ogre lock mutex name 為例。查詢得到以下巨集定義。threading ogrethreaddefinesboost.h define ogre lock mutex name boost recursive mutex scoped lock ogrenamelock name...

多執行緒的同步

執行緒的同步 在多執行緒程式設計中,這種會被多個執行緒同時訪問的資源叫做臨界資源。synchronized 關鍵字是乙個修飾符,可以修飾方法或 塊。其作用是 對於同乙個物件 不是乙個類的不同物件 當多個執行緒都同時呼叫該方法或 塊時,必須一次執行,也就是說,如果兩個或兩個以上的執行緒同時執行該段 如...