日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

探索未知种族之osg类生物---呼吸分解之更新循环一

發布時間:2023/12/10 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 探索未知种族之osg类生物---呼吸分解之更新循环一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上節總結

前幾天我們大體上介紹完成了osg的事件循環的介紹,總結一下osg的時間循環主要就是得到平臺(windows)的所有消息,并遍歷所有的node的eventCallback,并對他們進行處理。接下來我們就要進入osg的另一個維持生命的循環---更新循環。

更新循環

OSG 更新循環的作用與事件回調有類似之處:由專門的訪問器對象_updateVisitor 的負 責場景圖形更新遍歷;所有的節點和 Drawable 幾何體對象都可以使用 setUpdateCallback 設 置更新回調;通過具現 NodeCallback::operator()或者 Drawable::UpdateCallback::update 函數, 可以在回調對象中添加自定義的工作。

但是,更新回調與事件回調不同之處在于:事件循環是在當一個用戶交互動作或系統事件產生時,每個節點(以及 Drawable 對象)的事件回調才會被調用一次;而節點(以及 Drawable 對象)的更新回調只會在每幀中被調用一次。這一區別決定了我們應當在什么時候使用事件回調, 以及在什么時候使用更新回調。

osgViewer::Viewer::updateTraversal()

那我們就開始進入osgViewer::Viewer::updateTraversal(),updateTraversal和eventTraversal一樣首先都要定義目前處在的時間以及幀數,并進行記錄,這樣有利于進行統計分析。下面我們就要進入osgViewer::Viewer::updateTraversal()里最重要的函數osgViewer::Scene::updateSceneGraph()函數。

這個函數中我們先介紹一下它的主體功能,再去介紹這里遇到的一些新的概念。主要功能:

1、使用DatabasePager::updateSceneGraph函數更新場景的分頁數據庫,異步處理在分頁數據庫處理線程中。

2、ImagePager::updateSceneGraph函數, 更新場景的分頁圖像庫,異步處理在分頁數據庫處理線程中。

3、設置圖片請求的處理器。

我們先介紹一下DatabasePager和ImagePager

DatabasePager:分頁數據庫。在大型三維場景中采用數據分頁的方式進行動態調度。這里“分頁”的意思是隨著視口范圍的變化,場景只加載和渲染當前視口范圍內數據,并將離開視口范圍內的數據清除內存(可以設定不同的數據卸載策略),不再渲染。保證內存中只有有限的數據量,場景的每一幀也只有有限的數據被送到圖形渲染管道,從而提高渲染性能。

ImagePager: 分頁圖像庫。查看ImagePager 的相關內容了。這個類的工作 性質與 DatabasePager 沒什么大的區別,它主要負責的是紋理圖片文件的運行時加載工作。

DatabasePager和ImagePager都會用到獨立的線程進行他們自己的工作。我們想要進入讀懂他們代碼的內容,首先我們得具備openThread的基本知識。

openThread的基本知識

面向對象的跨平臺線程庫 OpenThreads 原本是獨立的開源工程,OSG 2.x 以后的版本將 其納入了自己的體系結構當中,成為 OSG 基本庫的一份子。 OpenThreads 庫包含了以下幾個主要的線程處理類:?Thread 類:線程實現類。它是一個面向對象的線程實現接口,每定義一個 Thread 類, 就相當于定義了一個共享進程資源,但是可以獨立調度的線程。通過重寫 run()和 cancel()這 兩個成員函數,即可實現線程運行時和取消時的操作;通過調用 start()和 cancel(),可以啟 動或中止已經定義的進程對象。?Mutex 類:互斥體接口類。如同 pthread 等常用的線程庫那樣,OpenThreads 也提供了互 斥體操作的機制,它有效地避免了各個線程對同一資源的相互競爭,即,某一線程欲操作某 一共享資源時,首先使用互斥體成員的 lock()函數加鎖,操作完成之后再使用 unlock 函數解鎖。一個線程類中可以存在多個 Mutex 成員,用于在不同的地點或情形下為共享區域加鎖; 但是一定要在適當的時候解鎖,以免造成線程的共享數據無法再訪問。?Condition 類:條件量接口類。它依賴于某個 Mutex 互斥體,互斥體加鎖時阻塞所在的 線程,解鎖或者超過時限則釋放此線程,允許其繼續運行。 這里涉及了幾個線程操作中重要的概念:同步,阻塞以及條件變量。線程同步,簡單來 說就是使同一進程的多個線程可以協調工作,例如讓它們都在指定的執行點等待對方,直到 全員到期之后才開始同步運行;擁塞,即強制一個線程在某個執行點上等待,直到滿足繼續 運行的條件為止。例如其它的線程到達同一執行點,某個變量初始化完成等等,可以通過條 件變量來設計各種條件。?Block 類:阻塞器類。顧名思義,這個類的作用就是阻塞線程的執行,使用 block()阻塞 執行它的線程(注意,不一定是定義它的 Thread 線程,而是當前執行了 block 函數的線程, 包括系統主進程),并使用 release()釋放之前被阻塞的線程。 下圖所示的代碼實現了一個簡單的線程,并演示了 Block 類的使用方法。運行程序后 可以發現,Block::block()函數將首先阻塞主進程,被釋放后再次阻塞的是 TestThread 線程, 這與它是誰的成員變量并無關系。BlockCount 類:計數阻塞器類。它與阻塞器類的使用方法基本相同:block()阻塞線程, release()釋放線程;不過除此之外,BlockCount 的構造函數還可以設置一個阻塞計數值。計 數的作用是:每當阻塞器對象的 completed()函數被執行一次,計數器就減一,直至減到零 就釋放被阻塞的線程。?Barrier 類:線程柵欄類。這是一個對于線程同步頗為重要的阻塞器接口,它的構造函 數與 BlockCount 類似,可以設置一個整數值,我們可以把這個值理解成柵欄的“強度”。每 個執行了 Barrier::block()函數的線程都將被阻塞;當被阻塞在柵欄處的線程達到指定的數目時,就好比柵欄無法支撐那么大的強度一樣,柵欄將被沖開,所有的線程將被釋放。重要的 是,這些線程是幾乎同時釋放的,也就保證了線程執行的同步性。 注意 BlockCount 與 Barrier 的區別,前者是由其它任意線程執行指定次數的 completed() 函數,即可釋放被阻塞的線程;而后者則是必須阻塞指定個數的線程之后,所有的線程才會 同時被釋放。 ScopedLock 模板:這個模板是與 Mutex 配合出現的,它的作用域之內將對共享資源進 行加鎖,作用域之外則自動解鎖。

?

原文鏈接? ?http://www.3wwang.cn/blog/article.ftl?id=22

轉載于:https://www.cnblogs.com/wang985850293/p/10469727.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的探索未知种族之osg类生物---呼吸分解之更新循环一的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。