XNA教程(三) sprite繪製效率

2021-04-09 05:53:27 字數 1986 閱讀 2477

雖然內容有所變動,但我的xna教程還會繼續^_^

本文和部分文字來自

xna diaries

,參考了其中兩篇關於sprite alpha blend的文章

spritebatch.begin

通過接受幾個引數,來控制如何渲染

sprite

。引數blendmode

表示進行哪種模式的混合。

xna只提供了三種,也是最常見的混合模式:alphablend

、additive

以及inversecolor

。這裡,我們主要討論

alphablend。

alphablend

根據當前

sprite alpha

通道中的值,對

sprite

顏色和幀緩衝中已存在的顏色進行混合。計算的公式為

finalcolor = spritecolor * alpha + backgroundcolor * alpha

。由於要查詢緩衝中的當前顏色,因此,

alpha

混合是乙個相對較昂貴的操作。 單有

spriteblendmode

並不能完全達到我們所希望的效果,當繪製多個圖形時,還需按照一定的順序繪製

sprite

才行。

上面這張掩飾了

5個半透明的環,按照不同順序繪製時,所得到的結果,其中,後者是我們所期望的效果。左圖中,我們最先繪製了中間的圓形,因此,它將和藍色的背景混合,導致最終的效果有一條藍邊。而右圖中,我們最後才繪製**的圓形。

有兩種方法來控制

sprite

繪製順序。第一種,使用

spritebatch.draw

帶depth

引數的過載,讓計算機在繪製圖形時根據

depth

值,為我們排序;第二種則是在我們自己編寫**來控制。

當場景中有大量

sprite

時,第一種方法是不錯的解決方案。為每個

sprite

都指定乙個

depth

,當物體移動時,簡單的改變它的深度,就能獲得正確的效果,比如

2d遊戲中,讓玩家從樹後移動到樹前。使用

spritebatch.begin

的sortmode

引數來指定從後到前,還是從前到後排序,通常情況下我們選擇前者。

另一種方法,側需要我們自己安排繪圖順序,比如先繪製背景,然後遊戲物件,接下來再繪製前方的遮擋物,

ui等等。當大量物體相互遮擋時,決定繪圖順序的邏輯可能會很複雜。但是,當場景不太複雜時,這是一種很高效的方法。

到這裡,就需要討論一下幾種混合模式下的效率:

y軸表示幀速率,

x軸表示

sprite數量

圖中,紅色是

spriteblendmode.none

,綠色是

spriteblendmode.alphablend

,藍色是

alphablend

以及spritesortoptions.backtofront

,灰色是

spritesortoptions.fronttoback。

可以看到,如果自己排序,那麼在有大量(

>500

)個sprite

的時候,能獲得相當不錯的收益(當然,這裡並未考慮我們手動排序的代價)。

而如果使用

spritebatch

來進行排序,那麼

sprite

數量最好不要超過

400個。當然,如果不使用

alpha

混合,效率又會提高很多。

當然,也許你還注意到了

spritesortoptions.fronttoback

狀態下效能異常的好,但不幸的是,這種方法通常不能建立正確的效果。

XNA入門(三)燈光和材質

光源 環境光 定向光源 例如無限遠處的太陽 點光源 燈泡 聚光燈 手電 private void setuplights 設定定向光源 private void setuplights 點光源 device.material mtrl device.lights 0 type lighttype.p...

XNA開發實用教程 遊戲窗體設定

xna開發實用教程 遊戲窗體設定三峽大學土木水電學院肖澤雲本教程的主要目的是讓你看完後,真正體會一下什麼是xna?xna中主要包括哪些部分?相信你自己,在看完整個教程後,你也能設計自己的三維場景!祝你成功!四 遊戲窗體設定 遊戲窗體設定均在public game1類裡面。1 設定啟動時窗體大小 gr...

XNA系列教程 2D碰撞教程2 畫素檢測

本教程詳細講解了畫素碰撞檢測的實現。注意 這個教程的 是在前乙個教程 2d碰撞教程 1 矩形檢測中實現的,在進行下面的教程前請確保已經完成教程 1的學習。在前乙個例子當中,你已經通過舉行碰撞檢測實現了乙個躲避下落物體遊戲。而矩形只是通過你載入的紋理貼圖的大小來決定的,並不能準確的代表你的遊戲角色的大...