Direct3D制作二維界面總結(原創)
Direct3D制作二維界面總結(原創)
因為工作關系,最近用Direct3D中的二維部分制作了一個軟件的界面部分,在這裡將其中的感受寫下來,與大家分享,也歡迎大家討論!
GDI與Direct3D簡單對比 GDI: CPU佔用少,但易產生畫面閃爍現象,在現成的函數中,可達到畫面效果比起Direct3D少的多。可以用現成的控件,處理消息方便,但受一定的系統限制!對硬件要求低。 Direct3D:由于程序結構的關系,CPU佔用高,須採用髒矩形技術(但增加程序復雜性),才可有效降低CPU佔用率,不會產生畫面閃爍,可較之容易地渲染出華麗的畫面!界面與用戶的交互,完全靠自己來渲染不同的畫面,控制比GDI 復雜,但可以精確地進行處理,達到自己想要的任何效果!對硬件有一定的要求,還需要裝相應的運行時庫,雖然使用髒矩形,可有效提高響應速度,但不同配置的機器,還是有明顯的差別!還需考慮設備丟失問題。
Direct3D制作的界面,實際為二維圖形交互程序。我在剛開始寫時,沒有經驗,便想到一點點來,但現在回想起來,程序結構是非常重要的,因為它不像GDI,有確定的處理方式,它沒有現成的框架可用,我們的界面是什麼樣子的,完全由自己來控制。因此設計部分時一定要考慮週全,我覺得最基本的要求就是:程序易于理解、擴展並且效率高!對某個事件,一定要理解清楚,如鼠標點擊某個圖形,你可以在鼠標按下時進行處理相應的事件,也可以在鼠標按下再彈起時再處理,這就要分清其區別,這也是看出,比起GDI可進行更好的控制。 在我的程序中,二維渲染,用的最多的是ID3DXSprite接口IDirect3DDevice9::UpdateSurface()方法(將後備緩衝作為參數) ,到後面基本上都用前一種了。為測試其性能,我仿照ID3DXSprite做過一個自己的精靈類,即創建頂點緩衝進行紋理渲染,在每次調用時,將頂點位置拷入,再進行渲染,發現兩者差不多,只是在渲染比較小的紋理且每一幀渲染很多張紋理時,自己做的精靈類要快一些,所以就沒有改它。不知大家是否認同?它可容易地渲染出透明的圖形,再配合好美工,做出漂亮的界面是不難的! 最終我的程序,使用髒矩形,大大降低了CPU佔用率,提高了響應速度。程序很小,不到500K,但裝入全部資源後,達到了近20M。
今天就想到這麼多了,歡迎討論,更希望拋磚引玉! 來Gameres.com這麼久了,這是第一次發這樣的貼子,希望和大家共同進步!:)
|