Sunday, March 22, 2009

改做背景地圖的架構

在上次的 SceneNode 測試中,得出了一個結果,就是在 OGRE 中如果有很多 SceneNode 的話,速度便會快速地下降。後來我想想,我的 Ogng'3D 中的背景地圖的 Portal 處理,每個背景物件都使用了一個 SceneNode,這樣便用了很多 SceneNode 來定義 Sectors,就以那個「多 SceneNode 便慢下來」的情況下,我便決定重新去想想,如何改善現在的 Portal 地圖架構,改變處理方法來減少 SceneNode 使用量。

改動已有的系統需要不少工程,因為從 Load 入 Portal、載入每個背景物件的 3D 資料,以致測試 Portals / Sectors 的等等步驟都牽涉到。

在今天 ( 星期六 ),用了一整天的時間 ( 真的超過 12 個小時呢 ... ),從兩晚前草草訂下的計劃中,完成了改造。改造後的背景地圖仍以 Portals / Sectors 為主,在背景地圖組成方面就改了「 以 Material 來做組別 」,使用同一個 Material 的背景物件,都用同一個 SceneNode 及 Entity 組合起來,就是說 SceneNode 數量和 Material 數量掛勾,而每一個背景物件就是一個 SubEntity。因為在我設計的地圖的資料中,已有各個背景物件的資料,在測試 Portals / Sectors 方面的改動,只是在測試後,改變相關 SubEntity 的 Visible 值便可。

這樣使用 SceneNode 量便可以減少,從而可減少 OGRE 中的 Drawcall 數量,增加 Render 背景地圖的速度。希望這個改動工程真的有效吧,因為我還未有一個有很多背景物件做測試的地圖 ......。
A simple Portalized game scene

Saturday, March 14, 2009

目標 : Vertex Animation 功能

對了,Vertex Animation 會是我下一個目標。

Vertex Animation 是個很久遠的技術,在早期的 3D 遊戲中已有使用,那時候 3D 角色的動畫全部都是用 Vertex Animation 做的。後來 Skeleton Animation 的興起,便代替了這個技術,但它並未就此被忘掉。

其實在現時的 3D 遊戲中,Vertex Animation 的用途在哪裡呢?主要是 Facial Animation。而我想開始做 Vertex Animation 的原因,就是因為想在 Ogng'3D 中,加進 Facial Animation 的功能。


還可以做一大堆的手部動作,代替手部大量 Skeleton 動畫。 正在努力中,謝謝。

Friday, March 13, 2009

OGRE 的 SceneNode 挑戰

究竟 OGRE 這個 3D 圖像引擎,是慢還是快呢?這個沒有確實的定論,因為每一個圖像引擎都有它的特點 ( 牆頭草言論 :D )。

今天聽到同事們說,OGRE 中的 SceneNode 在更新方面未盡善盡美,一多起來便會很慢。我也不知道當中的問題在哪裡,因為我從來沒有了解過她的內部運作。今晚回家後,便想試試如果 SceneNode 真的有很多,那麼會慢了多少?

下圖是我用了之前測試新 Sprite 系統的 Demo,轉為直接每個 Sprite 都用一個 SceneNode 來控制,總共有 256 個 Sprites,同時在畫面中從左到右不停的移動,而且還用了我新加入的 SpriteGroup 系統,另外再畫出 500 個 Sprites ( 只用一個 SceneNode,但很難看得到,因為前面說的 256 個 Sprites 已經很密集 )。

Demo 的整體速度當然是下降了,但在百分點上,大約是慢了 30%。我不太清楚這個數字是不是很差,但在於我來說,它能夠保持在 60 Frames per second 的速度,已經很不錯的了。