一,概述
scene graph
的目的是組織物體。
兩個原則:
1。空間從屬關係(樹) 2
.render state
的相似性。
原則一是為了快速剔除大批不可見物體。
原則二是為了減少
renderstate
的頻繁改變。
二者均可使遊戲速度大大提高。
原則一通過空間劃分實現(
bounding volumes
),原則通過排序實現。
然而兩個原則是互不相容的。若按
rs排序,物體必然會分散於各個空間。理論上講,兩個原則那個更快就以那個為排序標準。
事實上通常以原則一為準,即先將所有物體按空間從屬關係分塊,確定出可見物體後,再按
rs排序。
以下為scene graph
管理系統的巨集觀結構: 更新
geometric state
(如頂點資料,變換,空間從屬關係等)
render state (
global state
,lights
,effects等)
剔除不可見物體
繪製(呼叫渲染系統)
使用者作出反應
應用程式,回到初始迴圈。 在
wm4中,
culling pass
與drawing pass
完全分開,便於多執行緒渲染。
二,
scene graph的幾個核心類。
關係:geometry
派生於spatial
,node
也派生於
spatial
。spatial
基於object。
spatial
類中封轉了
local transformation
,world transformation
和world bound
等等。
對以上三個名詞的解釋: 1.
世界空間中有乙個房間,房間裡有乙個桌子。將桌子擺到房間裡的變換為
local~ 2
.將房間擺到世界空間中的變換為
world transformation
。同時,桌子也會進行
world transformation 3
每個物體都有自己的
local bound
(基於物體座標系),進行
world transformation
後,local bound
的位置,大小,形狀都有可能變化,變化後成了
world bound。
geometry
類中封裝了所有的物體屬性(
position,index,color,texture coordinates,scale factor,local bounding volume,normals
等等)
除local bound
,其餘屬性都被封裝在
vertexbuffer
和indexbuffer中。
另外,光照通過將
light
類關聯到
geometry
實現(在
geometry
類中儲存乙個
light*
),local effect
通過將shadereffect
類關聯到
geometry
實現。global effect
通過將effect
類關聯到
geometry
實現。
node
類封裝了對物體的組織函式,具體完成如下功能: 1.
在向下遍歷中,先計算父節點的
world transformation
,再利用此
world~
與子節點的
local transformation
相乘得到每個
child
的worldtransformation。
2. 向下遍歷結束後,每個
geometry
會利用計算好的
world transformation
與local bound
相乘得到
world bound。
3. 向上遍歷中,利用每乙個
child
的world bound
計算父節點的
world bound。
注: node
的world bound
乘以world transformation
的逆變換可得
node
的local bound
,但用處不大,所以未能支援,需要時實時計算即可。
node
有world bound
,但沒有
model bound
,因為它只管理物體,本身並不是乙個物體。 每個
geometry
都有自己的
world transformation
和world bound。
三個核心類之間的關係:
geometry
在spatial
的基礎上增添了物體的所有屬性和
local bound,
node
在spatial
的基礎上增添了向子節點的鏈結以及對物體的管理方法。
如此一來,
geometry
只負責物體本身,
node
只負責對物體的管理,使兩個截然不同的概念相互分開,方便了**的維護與擴充套件。
注:一種更簡潔的設計方法是只建立乙個類
node
,它既負責物體屬性,又負責物體組織,這樣做使場景圖更加簡潔,**也更易於使用,但增加了**維護和擴充套件的難度。
三,關於
sharing object。
共享類的目的有二:
(1)節省記憶體,避免了大量資料的複製。
(2)節省美工工作量,避免特意製作世界中的每乙個物體。(當然,不能有太強的重複感。) 但本
scene graph
並不支援
node
類和geometry
類的共享,即每乙個節點只允許有乙個父節點,但可以有多個子節點。因為如果支援多個父節點,**開發難度會很大,詳見
p230-232
。實際上,本
scenegraph
仍支援共享,不過是底層的共享,也就是說對vb和
ib 的共享。
四,
controller類和
modifiers。
controller
是乙個抽象類,它的作用是實現動畫;而
modifiers
是對一系列類的統稱,它的作用是提供物體屬性的附加資訊,因此,
modifier
通常由geometry
派生而來。
controller
的分類:(詳見
5,7章)
(1)keyframe controller
:用於關鍵幀動畫。美工提供一系列關鍵幀(物體的位置和朝向)
,controller
對其進行平滑插值形成流暢的動畫。
(2)inverse kinematic controller
:用於自動動畫,例如人物去拿杯子,
controller
便會計算出相應的位置和朝向,控制人物的動畫。
(3)vertex and normal controller
:用於網格分解。
(4)render state controller
:用於某些特效,如動態紋理。
(5)index controller
:用於lod
基本思路是物件導向程式設計中的
open-close
原則。
controller
是乙個核心類,基於此派生新類以新增新的特性,但核心架構不發生變化這樣易於維護和擴充套件。
4 1鎖的優化
只在必要時進行同步。指的是縮小鎖定物件的範圍,減少鎖衝突的可能性。比如hashmap concurrenthashmap 減小鎖粒度引來的新問題 當系統需要取得全域性鎖時,其消耗的資源會比較多。屬於減小鎖粒度的一種特殊情況,如果說concurrenthashmap是通過分隔資料結構來減小鎖粒度,那麼...
例題4 1 古老的密碼
給定兩個長度相同且不超過100 的字串 判斷是否能把其中乙個字串的各個字母重排 然後對26個字母做乙個一一對映,使得兩個字串相同。例如 jwpudjstvp 重排 後可以得到wjdupsjpvt 然後把每個字母對映到到前乙個字母 得到victorious。輸入兩個字串 輸出yes 或者是 no 分析...
41 整數序列的查詢
題目描述 輸出所有和為 s 的連續正數序列。序列內按照從小至大的順序,序列 間按照開始數字從小到大的順序 思路 定義兩個指標,分別遞增,尋找和為 s 的序列。實現 public arraylist findcontinuoussequence int sum int small 1 int big ...