3D遊戲程式設計:Direct3D幫我們做了哪些事情?

“學”的部分

每一個程式設計師或多或少都有一些“傲氣”,因為他們掌握了別人掌握不了的東西,難免會沾沾自喜。實際上,每個行業都有這樣的現象,某些人自以為很強,然後就會看不起那些能力比較弱的。說得再“接地氣”一些,這就是“鄙視鏈”。

程式設計界的“鄙視鏈”道理是一樣的,那些會“核心技術”的程式設計師,就會“鄙視”其他的程式設計師了。“鄙視鏈”在年輕程式設計師中不算明顯,主要是在那些“資深的”、年長的程式設計師圈子中比較常見。尤其是會寫3D遊戲的老程式設計師,目光是非常高的,他們甚至會看不起DirectX!

DirectX的技術中,讓所有程式設計師都佩服的地方有兩個:

其一,就是COM技術;

其二,是DirectX虛擬了所有的硬體,讓遊戲程式設計不再考慮繁瑣的硬體控制。

第二點怎麼理解呢?

3D遊戲程式設計:Direct3D幫我們做了哪些事情?

在沒有DirectX之前,我們要寫一個遊戲是比較麻煩的。雖然作業系統(比方說Windows)提供了很多控制介面,這些控制介面可以控制顯示螢幕、聲音、鍵盤、滑鼠等等,但是,這些介面都是為普通程式設計的,遊戲程式完全沒法用。

舉個簡單的例子。Windows控制鍵盤的方式,是透過Windows訊息來處理的。我們前面學過,Windows訊息是有一個訊息佇列的。說得再明白寫,就是鍵盤的響應是緩慢的。當用戶按下某個鍵的時候,鍵盤產生電流,告訴Windows系統使用者按了某個鍵。然後,Windows系統把這個鍵的資訊打包成Windows訊息的格式,傳送給當前活動的視窗(最前面的一個視窗)。視窗透過訊息迴圈,可以接收到這個訊息,然後使用訊息處理函式來處理這個鍵盤訊息。

這一系列的複雜動作,其實是非常消耗時間的。由於同一時間內Windows訊息的數量非常龐大,這個鍵盤訊息傳遞到視窗的時候,可能已經等待了比較長的時間了。

然而,我們人是感覺不到“延遲”的,畢竟只有零點幾秒的時間。可是,零點幾秒對於電腦來講,卻是一段非常長的時間,對於遊戲程式來說,這個響應時間實在是太長了點。

所以,一個程式設計師要在遊戲中處理鍵盤按鍵,必須獲得鍵盤的直接控制權,也就是說,當這個遊戲程式執行的時候,會直接擷取鍵盤按鍵時的電流資訊,這樣,就不存在排隊等待的延遲了。

而要直接獲得鍵盤的電流資訊,是一項非常困難的工作,尤其是在Windows這樣的環境下(在DOS環境下還可以用中斷),程式設計師甚至需要懂得鍵盤的驅動程式內容!這也是為什麼,在沒有DirectX之前,遊戲程式設計師非常喜歡在DOS環境下寫遊戲,因為控制鍵盤簡單啊!

不僅僅是鍵盤,程式設計師還要面對更為複雜的顯示螢幕,甚至是顯示屏後面的顯示卡!也就是說,一個遊戲程式設計師,在正式寫遊戲之前,光處理這些硬體問題,就會搞得焦頭爛額。

而DirectX呢?直接把程式設計師和硬體分開了。它建立了新的COM介面,用COM介面來代替硬體介面。這樣的話,一個程式設計師只需要寥寥幾行的程式碼,就能獲取一個硬體的完整控制權,至於背後那繁瑣的工作,就交給DirectX來處理吧!

由於這兩點非常“硬核”以及“高能”,沒有程式設計師會看不起這兩點,DirectX也被很多程式設計師推崇。

3D遊戲程式設計:Direct3D幫我們做了哪些事情?

但是,3D遊戲程式設計師中,有那麼一些人自視甚高,他們非常看不起DirectX中的Direct3D。原因其實很簡單,他們可以不依靠Direct3D就能寫出效率不錯的3D程式,而Direct3D,僅靠簡單的幾個步驟,就可以讓新手寫出效果不錯的3D程式,你說,這讓他們內心怎麼平衡得了?

他們在自己寫3D程式的時候,曾經為了最佳化一個矩陣的乘法計算,熬了好幾個大夜才解決;他們為了讓燈光看起來更加真實,翻遍了大量的書籍資料;他們為了讓攝像機的運動過程更加順暢,努力學習了一個多月的四元數!可是,這一切在Direct3D這裡都是多餘。程式設計師不需要懂得太多的東西,就能寫出更好的程式來,你說,氣人不氣人?

但是,這些會3D遊戲程式設計內涵的程式設計師,依舊看不起只用Direct3D寫遊戲的人,因為,他們懂得矩陣的內涵,而後者只是迷迷糊糊地在使用罷了。

我們學校Direct3D的時候,千萬不要有什麼心理負擔,因為我們只是愛好,只要能寫出遊戲來,怎麼樣都是好的。而且,只要你認真學習本課程,你會明白3D遊戲程式設計中的每一步。雖然用Direct3D實現起來比較容易,但是,這個原理你是明白的。你和那些拋棄Direct3D寫遊戲的人來講,只是不懂得內部那複雜的數學計算罷了。而且,這些數學計算真的沒必要學,否則真的太浪費時間了。這麼說吧,如果再出個專欄,講解矩陣在3D遊戲程式設計中的詳細運用,幷包含具體的計算過程和步驟,那麼,寫個100章,每章上萬字,都不一定能講明白。所以,我們懂得原理就行,不必深究。

那麼,Direct3D到底幫我們做了哪些複雜的工作呢?不急,我一點一點來說。

1.抽象了複雜的顯示裝置