Ogre的多執行緒同步支援

2021-04-14 16:46:29 字數 2195 閱讀 2406

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

。相關的檔案可以從

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 關鍵字是乙個修飾符,可以修飾方法或 塊。其作用是 對於同乙個物件 不是乙個類的不同物件 當多個執行緒都同時呼叫該方法或 塊時,必須一次執行,也就是說,如果兩個或兩個以上的執行緒同時執行該段 如...