「學」的部分
每一個程式設計師或多或少都有一些「傲氣」,因為他們掌握了別人掌握不了的東西,難免會沾沾自喜。實際上,每個行業都有這樣的現象,某些人自以為很強,然後就會看不起那些能力比較弱的。說得再「接地氣」一些,這就是「鄙視鏈」。
編程界的「鄙視鏈」道理是一樣的,那些會「核心技術」的程式設計師,就會「鄙視」其他的程式設計師了。「鄙視鏈」在年輕程式設計師中不算明顯,主要是在那些「資深的」、年長的程式設計師圈子中比較常見。尤其是會寫3D遊戲的老程式設計師,目光是非常高的,他們甚至會看不起DirectX!
DirectX的技術中,讓所有程式設計師都佩服的地方有兩個:
其一,就是COM技術;
其二,是DirectX虛擬了所有的硬體,讓遊戲編程不再考慮繁瑣的硬體控制。
第二點怎麼理解呢?
在沒有DirectX之前,我們要寫一個遊戲是比較麻煩的。雖然作業系統(比方說Windows)提供了很多控制接口,這些控制接口可以控制顯示屏幕、聲音、鍵盤、滑鼠等等,但是,這些接口都是為普通程序設計的,遊戲程序完全沒法用。
舉個簡單的例子。Windows控制鍵盤的方式,是通過Windows消息來處理的。我們前面學過,Windows消息是有一個消息隊列的。說得再明白寫,就是鍵盤的響應是緩慢的。當用戶按下某個鍵的時候,鍵盤產生電流,告訴Windows系統用戶按了某個鍵。然後,Windows系統把這個鍵的信息打包成Windows消息的格式,發送給當前活動的窗口(最前面的一個窗口)。窗口通過消息循環,可以接收到這個消息,然後使用消息處理函數來處理這個鍵盤消息。
這一系列的複雜動作,其實是非常消耗時間的。由於同一時間內Windows消息的數量非常龐大,這個鍵盤消息傳遞到窗口的時候,可能已經等待了比較長的時間了。
然而,我們人是感覺不到「延遲」的,畢竟只有零點幾秒的時間。可是,零點幾秒對於電腦來講,卻是一段非常長的時間,對於遊戲程序來說,這個響應時間實在是太長了點。
所以,一個程式設計師要在遊戲中處理鍵盤按鍵,必須獲得鍵盤的直接控制權,也就是說,當這個遊戲程序運行的時候,會直接截取鍵盤按鍵時的電流信息,這樣,就不存在排隊等待的延遲了。
而要直接獲得鍵盤的電流信息,是一項非常困難的工作,尤其是在Windows這樣的環境下(在DOS環境下還可以用中斷),程式設計師甚至需要懂得鍵盤的驅動程序內容!這也是為什麼,在沒有DirectX之前,遊戲程式設計師非常喜歡在DOS環境下寫遊戲,因為控制鍵盤簡單啊!
不僅僅是鍵盤,程式設計師還要面對更為複雜的顯示屏幕,甚至是顯示屏後面的顯卡!也就是說,一個遊戲程式設計師,在正式寫遊戲之前,光處理這些硬體問題,就會搞得焦頭爛額。
而DirectX呢?直接把程式設計師和硬體分開了。它創建了新的COM接口,用COM接口來代替硬體接口。這樣的話,一個程式設計師只需要寥寥幾行的代碼,就能獲取一個硬體的完整控制權,至於背後那繁瑣的工作,就交給DirectX來處理吧!
由於這兩點非常「硬核」以及「高能」,沒有程式設計師會看不起這兩點,DirectX也被很多程式設計師推崇。
但是,3D遊戲程式設計師中,有那麼一些人自視甚高,他們非常看不起DirectX中的Direct3D。原因其實很簡單,他們可以不依靠Direct3D就能寫出效率不錯的3D程序,而Direct3D,僅靠簡單的幾個步驟,就可以讓新手寫出效果不錯的3D程序,你說,這讓他們內心怎麼平衡得了?
他們在自己寫3D程序的時候,曾經為了優化一個矩陣的乘法計算,熬了好幾個大夜才解決;他們為了讓燈光看起來更加真實,翻遍了大量的書籍資料;他們為了讓攝像機的運動過程更加順暢,努力學習了一個多月的四元數!可是,這一切在Direct3D這裡都是多餘。程式設計師不需要懂得太多的東西,就能寫出更好的程序來,你說,氣人不氣人?
但是,這些會3D遊戲編程內涵的程式設計師,依舊看不起只用Direct3D寫遊戲的人,因為,他們懂得矩陣的內涵,而後者只是迷迷糊糊地在使用罷了。
我們學校Direct3D的時候,千萬不要有什麼心理負擔,因為我們只是愛好,只要能寫出遊戲來,怎麼樣都是好的。而且,只要你認真學習本課程,你會明白3D遊戲編程中的每一步。雖然用Direct3D實現起來比較容易,但是,這個原理你是明白的。你和那些拋棄Direct3D寫遊戲的人來講,只是不懂得內部那複雜的數學計算罷了。而且,這些數學計算真的沒必要學,否則真的太浪費時間了。這麼說吧,如果再出個專欄,講解矩陣在3D遊戲編程中的詳細運用,並包含具體的計算過程和步驟,那麼,寫個100章,每章上萬字,都不一定能講明白。所以,我們懂得原理就行,不必深究。
那麼,Direct3D到底幫我們做了哪些複雜的工作呢?不急,我一點一點來說。
1.抽象了複雜的顯示設備