作者:clayman
僅供個人學習使用,請勿轉載,勿用於任何商業用途。
由於本人水平有限,難免出錯,不清楚的地方請大家以原著為準。歡迎大家和我多多交流。
Blog:http://blog.csdn.net/soilwork
clayman_joe@yahoo.com.cn
雖然內容有所變動,但我的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狀態下效能異常的好,但不幸的是,這種方法通常不能建立正確的效果。