最近翻看CEGUI代碼的時候發現,CEGUI 0.7在構架上比之前版本有了裡程碑式的提升。
每當需要重繪時,CEGUI都會提供給渲染器一個隊列,其中包含了所有已經排序好的待渲染單位。CEGUI 0.7對這個隊列進行了巨大改善。
CEGUI 0.6及此前版本中,渲染隊列的填充方式如:
圖1 CEGUI 0.6及以前版本渲染隊列填充方式
所有的CEGUI視窗都將本視窗中需要渲染的圖片,填充到CEGUI系統的大渲染隊列裡。如果有一個CEGUI視窗需要更新,那麼整個大隊列都需要清空並被重新填充,也就是所有視窗都需要再次將自己的圖片往大隊列中投放一遍,這會導致幀數驟降。
也許你會注意到中CEGUI Windows層和大隊列層中間還有一個緩衝層RenderCache,它是CEGUI為避免視窗無意義的重複重新整理所提供的一個方案,也就是說,如果一個視窗不需要重新整理,它對應的RenderCache緩衝就不需要改變。在實際應用中,這個方案收效並不明顯。如果一個視窗包含有文字,那麼這些文字中的每一個字元,都會通過字型類裡的一張映射表,最終映射為一張圖片,被填充到大隊列裡,即每次填充時都需要一個查詢映射表的過程,這個查詢過程並不是發生在視窗到RenderCache層之間,而是發生在RenderCache層到大隊列層之間,這就意味著每次填充時的大量查詢操作會再次導致幀數驟降,這使得RenderCache的效果大打折扣。實際上,CEGUI 0.7直接去掉了這一層。
CEGUI 0.7渲染隊列的填充方式如:
圖2 CEGUI0.7版本渲染隊列填充方式
可以看到0.7中引入了GeometryBuffer結構直接作為渲染隊列的待渲單位,每個視窗對應一個GeometryBuffer,如此一來,如果視窗之間的前後次序沒有發生變動,渲染隊列是不需要被重新填充的。確切地說,GeometryBuffer提供了比RenderCache更好的緩衝功能,得益於這個結構,0.7的渲染隊列也比前版本的渲染隊列給出了更合理的填充方案。理想情況下,這種設計會使你的遊戲效能獲得上百幀的提升。
值得一提的是,之前版本的CEGUI渲染隊列僅提供Quad類型的渲染單位,也就是說你只能渲染四邊形圖元。而0.7版本的渲染隊列裡的GeometryBuffer,引入了Vertex頂點列表的概念,理論上你可以渲染手繪多邊形圖元。這讓實作類別似《魔獸世界》裡技能表徵圖的冷卻計時效果(一個形如時鐘的扇形圖元)變得相當容易,這種效果如果使用之前版本的CEGUI來實現,可要大費一番周折了。
綜上,如果你的項目仍在使用CEGUI 0.6,立刻開始考慮CEGUI 0.7吧!