教孩子寫遊戲:在Windows下寫3D遊戲,為什麼需要DirectX?

2020-12-09 我是遊戲小胡

「學」的部分

只要你能扎紮實實地把上一節的內容學會了,你現在就比很多大學計算機本科專業的大一學生要強了,因為他們可能不怎麼懂Windows編程,而你已經抄了好幾遍代碼了。雖然這種學習方法有點「簡單粗暴」,但是,複雜的內容往往就需要這樣的方法。而且,這個課程是為了激發小孩子的興趣,你不學紮實一點,如何引導小孩?

有了框架之後,我們就可以把遊戲內容寫在窗口之中了。那麼,接下來,我們要直接開始寫遊戲核心內容嗎?

我想,你的答案和我一樣:不是的。因為我們要寫一個3D的小遊戲示例,即便這個示例再簡單,也包含了巨量的知識點,在你不了解這些知識點之前,你面對3D遊戲的核心代碼就和看天書差不多。所以,在開始寫這個3D遊戲示例之前,我們需要用好幾節課的篇幅把這些必須要知道的知識點講清楚了。

這一節作為重要知識點的入門,我設置的比較簡單,只需要懂得一點:為什麼要用DirectX來寫遊戲?

我們慢慢來說。

3D遊戲和2D遊戲有著本質的區別。2D遊戲其實可以看成是一個可以操控的動畫而已,程式設計師只需要按照一定的規律把一些二維的圖片顯示在屏幕上就可以了,而計算機屏幕本就是二維的,是一個一個的像素矩陣,顯示起來其實是很簡單的一件事情,根本就不需要消耗太多的CPU資源。所以,90年代的電腦基本上沒有獨立顯卡,都是集成在主板上的集成顯卡,因為顯示一個二維圖像的任務實在是太輕鬆了。

而3D遊戲呢?問題一下子就複雜起來了。我們的屏幕是二維的,要在一個二維的屏幕上表現出一個三維的東西,真的不是一件容易的事情。就拿最簡單的立方體來講,要讓玩家覺得這個是立方體而不是多邊形,最簡單的方法,是讓玩家可以操控這個立方體。比如玩家可以操控這個立方體朝著各個方向移動,或者可以讓這個立方形任意旋轉等等。

要解決這個問題,乍一看真的沒有什麼頭緒。實際上,曾經的程式設計師剛開始探索3D遊戲的時候,也是沒有頭緒的。但是,程式設計師都比較聰明,會從生活中的方方面面來汲取經驗。

程式設計師前輩們發現,電影和3D遊戲很像,因為電影也是在一個二維的平面(電影布)上展示著三維的世界,而且,觀眾們並不會覺得這是二維的。既然有現成的成功案例,為什麼不借鑑呢?

程式設計師仔細研究了放電影的步驟,就是用一個投影儀把一張一張的膠片投影到電影布上,然後因為視覺暫留的關係,我們就能看到一個「動起來」的畫面了。

把這個過程分解得再細一些:

1.首先我們需要膠片;

2.然後有一臺能投影的儀器;

3.保證1秒鐘能投影24張膠片。

我們類比到電腦遊戲中,程式設計師驚奇地發現,第2和第3點已經不是什麼問題了,因為2D遊戲就是把二維的圖片繪製到計算機屏幕上,也就是說,「投影儀」和24幀不是什麼問題。那麼,程式設計師唯一要解決的,就是這些「膠片」了。

再深入研究一下,這些膠片是怎麼來的呢?

答案很明顯:是通過攝像機拍攝現實的場景得來的。

既然是拍攝來的,那麼,計算機遊戲中,能不能也用拍攝的方法呢?於是乎,程式設計師就寫出了一個比較可行的解決方案:

1.在計算機中創建一個虛擬的3D世界,並把所有需要的東西放進去;

2.用一個虛擬的攝像機,在這個虛擬的3D世界中拍攝並得到一張張的膠片。

在大量程式設計師們的努力下,這個過程被分解成了很多細小的問題,然後逐一都攻破了。雖然3D顯示的問題被解決了,可程式設計師們發現了另一個非常頭疼的問題:計算機完全無法承受這種級別的計算量,真的寫出遊戲的話,計算機根本就帶不動!

創建虛擬3D世界,並用虛擬攝像機拍攝,牽扯到了非常非常多複雜的數學計算,當時的CPU很難快速計算這麼多數據。而且,必須保證1秒鐘可以顯示24張「膠片」,可是,當時都是集成顯卡,面對這個問題是有點吃力的。

所以,在發展了幾年後,獨立顯卡就出來了。為什麼是獨立顯卡呢?因為,這種顯卡有著一部分CPU的功能,可以減輕CPU的負荷。為了功能獨立化,顯卡中的CPU被叫做GPU,這個GPU的性能可能比CPU要好,並且,GPU只計算3D顯示中的那些複雜的、巨量的數學計算。

我們現在能玩到很多非常逼真的3A遊戲,高性能的獨立顯卡功不可沒。舉個簡單的例子,作為家長,你應該知道CS這個遊戲吧?CS是比較老的遊戲了,這個遊戲對電腦性能的要求不是特別高,一般的顯卡就能帶動了。而現在的電腦基本上都是i7、i9的處理器,還有一塊比較不錯的顯卡,運行這個CS是一點兒問題都沒有的。好了,現在假設你拆掉了電腦的顯卡,換上了一塊幾乎沒有計算能力的集成顯卡,那麼,CS遊戲中的所有複雜的數學計算就會一下子壓給CPU。i7處理器計算這些數學計算不是什麼大問題,但由於數量過於龐大,會嚴重影響遊戲的效率,最後顯示到屏幕上就會非常卡。所以,顯卡才是3D遊戲流暢運行的基本。

有了顯卡後,3D遊戲運行已經沒什麼問題了,現在的問題是,3D遊戲編寫過程中的那些數學計算太複雜了。怎麼說呢?一個程式設計師可能要學習好幾個月才能完全學明白這些複雜的數學計算,然後才能在程序代碼中正確地使用這些數學計算。

但是,程式設計師是出了名的懶,如此複雜的東西,而且還是有規律的複雜內容,為什麼不寫成工具呢?把這些數學計算的過程集合起來,寫成一個一個的函數,這樣程式設計師用起來方便,也不容易出錯。這就是DirectX之類「工具」的雛形了。

也就是說,DirectX就是幫我們處理3D遊戲中的那些非常複雜的數學計算的。當然,能處理這些數學問題的工具非常多,DirectX只是其中的一個,另一個非常出名的是OpenGL(優化可能比DirectX要好)。但是,我們為什麼不用OpenGL,而要去用DirectX呢?原因非常簡單——DirectX是微軟提供的。

我們的遊戲要在Windows平臺下運行,當然是用微軟提供的DirectX更好了。

其實,DirectX是微軟提供的一套遊戲開發工具,其中的東西非常多,包含了遊戲開發的方方面面,除了3D方面的內容外,還有圖像顯示、輸入輸出、聲音播放等等功能,非常全面。DirectX中「X」的意思就是代表很多的意思,專門處理3D方面內容的其實叫做Direct3D,處理聲音的是DirectSound,處理輸入的是DirectInput等等。

而OpenGL只是一個3D處理而已,像聲音、輸入等內容還需要額外去找工具,作為程式設計師,當然更喜歡DirectX了。

還有,我們使用的是Visual Studio來寫遊戲,這個也是微軟的,兩者的契合度是非常高的。

總結一下,寫遊戲要DirectX的支持,主要是要利用其中的3D數學計算功能,否則,我們幾乎寫不出效率很高的3D遊戲。

「習」的部分

我們已經安裝了Visual Studio了,這裡我們需要把DirectX安裝上。程式設計師開發用到的DirectX和玩家玩遊戲安裝的DirectX不太一樣,程式設計師的DirectX多了非常多的內容。安裝的步驟也麻煩一些:

1.在微軟官網或者是其他網站上下載一個DirectX SDK;

2.建議把DirectX SDK安裝到根目錄;

3.在Visual Studio中設置DirectX SDK的路徑,方法如下:打開Visual Studio菜單「工具」下面的「選項」,在彈出的對話框中找到「VC++目錄」的項目,分別在「包含文件」和「庫文件」下添加新目錄,指定DirectX SDK的include目錄和lib目錄。DirectX SDK安裝後是一個文件夾,裡面包含了很多目錄,include和lib就是其中的兩個。需要注意的是,lib中可能有x86和x64兩個子目錄,我們要選擇x86的目錄,因為我們寫的是32位的遊戲程序。

DirectX的版本挺多的,我們作為學習,只需要DirectX9.0就可以了,而且,我們的示例程序也是用DirectX 9來寫的。DirectX是一個向下兼容非常完美的工具,現在的電腦基本上都安裝了用戶版本的DirectX 11或者12,運行一個9版本的DirectX程序是完全沒有問題的。

你可能要問,為什麼不用DirectX10以上的版本來寫呢?答案就是——沒必要。9是一個非常成熟的版本,只要熟練掌握了9,你幾乎就能寫出任何類型的3D遊戲了(應該沒有多少人敢說熟練掌握的),而10往上的版本,幾乎是為了大型3A遊戲而開發的,其中有一些高級的功能。我們寫遊戲只是愛好,真的沒必要接觸這些太高級的內容。

相關焦點

  • 教孩子寫遊戲:稍微深入了解一下DirectX
    不過,複製粘貼只能用於普通的編程,遊戲編程靠複製粘貼是絕對不可行的,否則的話,你做出來的遊戲就會和別人的一模一樣,因為,遊戲程序實在是太複雜了。而且,一般的程序比較好懂。比方說我要教某個人用C++寫一個記事本程序,我不會和他說一堆前奏,只會直接給他看代碼。
  • 教孩子寫遊戲:手寫一個最最簡單的Windows程序框架
    如果這樣想的話,你就很難教好孩子了。編程的高難度時代已經過去,各種各樣的底層技術難題已經被我們的前輩們解決,而且很好地封裝到了各種各樣的函數中,我們只要懂得如何去使用就可以了。這一節課,我們就用這個集成工作環境寫一個Windows程序的框架。
  • 教孩子寫遊戲:3D遊戲編程離不開矩陣,我們要如何理解矩陣?
    雖然說,我們不需要對矩陣有非常深入的理解,但是,這並不代表著我們可以不學矩陣。這麼說吧,如果你對矩陣一無所知,那麼,整個3D遊戲編程你是學不懂的。你可以靠著強大的記憶力把本課程的代碼記住,並且也能通過自己的摸索寫出類似的3D遊戲來,但是,你對其中的原理是不理解的,將來想要寫功能更強大的3D遊戲,就純粹是天方夜譚了。
  • directx9.0c官方下載_directx9.0c下載安裝「dx9修復工具」-太平洋...
    directx是微軟推出的加強windows 3d圖形和聲效的優化工具,directx9.0c官方下載版旨在讓windows成為運行和顯示具有豐富多媒體元素的應用程式的理想平臺,directx9.0c包括安全和性能更新程序,以及許多涵蓋所有技術的新功能。本站提供directx9.0c官方下載.
  • 教孩子寫遊戲:3D遊戲編程的必備數學知識,理解三維空間向量
    因為我們要寫的是3D遊戲程序,所以,我們必須要接觸兩個數學方面的難點知識——向量和矩陣。有的人問:這個這麼難,我們可不可以不學?我的答案是這樣的:如果你是有心要學習本課程,那麼這個是必須要學習的,是沒有道理可講的,是想破了腦袋也要學明白的。
  • 教孩子寫遊戲:如何通俗地讓孩子明白遊戲在電腦上的運行過程?
    但是,我們要寫程序,一定要懂得程序的運行過程,否則寫程序的時候容易一頭霧水。所以,我把遊戲程序的運行過程分解成了如下的幾個知識點,這樣的話,你給孩子轉述的時候也會方便許多。但是要利用工具包中的工具,需要使用一種名叫「二進位」的東西才能操控。可是,二進位的內容太過於晦澀難懂,一個正常的人想要用這些二進位的內容,手裡需要抱著一本非常厚的字典,才能勉強看懂極少的部分,因為那是一堆0和1的數字組合,想要分清楚都很困難。為了方便使用,最早的一批前輩們做出了最開始的程式語言,把一整本字典寫了進去。
  • 教孩子寫遊戲:作為新手,要如何理解遊戲中的3D世界呢?
    坐標系對於你來說,是很容易理解的事情,但是,對於一個孩子來講,可能有點麻煩,所以,關於如何讓孩子更容易理解坐標系,我放在文章最後專門講解。在這裡,我先假定,你是大學本科的水平。不是所有本科生都特別明白3D坐標系的,但是,平面的2D坐標系應該都懂,否則你也考不上大學。所以,我還是先簡單說一說什麼是3D坐標系。
  • 教孩子寫遊戲:矩陣在3D遊戲編程中是如何被使用的?
    好了,大致了解了前因後果之後,我們來看一看矩陣在3D遊戲編程中到底怎麼用吧。一、虛擬3D中的3D物體需要有哪些操作?我們再簡單複習一下遊戲中的3D世界。但是,在3D遊戲編程中,這3個步驟的順序並不是這樣的,而是按照先縮放、再旋轉、後平移的步驟進行的。二、從旋轉開始為什麼是縮放->旋轉->平移的步驟呢?還是拿小汽車為例。
  • 教孩子寫遊戲:什麼是作業系統?它和程式語言有什麼關係?
    作為一個程式設計師,只需要熟悉這100個基礎功能怎麼用,就能寫出各種各樣的擴展程序了。比方說,我們要編輯文字,程式設計師就用這100個功能給我們寫了一個DOS版本的文字編輯程序。所以,從DOS系統開始,計算機的程式語言就已經和計算機的作業系統綁定了,因為所有的計算機基礎功能都是作業系統給的,如果程式語言和作業系統分開,那麼,程式設計師就需要自己編寫計算機的那些基礎功能。
  • 孩子寫不好作文怎麼辦,小學生如何寫好一篇作文
    3、學會找參考作文學會在網絡上找優秀作文,模仿優秀範文去寫,比如百度、作文匯(https://www.zuowenhui.com/)等平臺,都提供了很多優秀範文,非常實用,但要記住,是模仿和借鑑靈感,而且不是抄襲,最好一句話也不要抄襲。4、請老師幫忙輔導若實在不知道怎麼寫,就請老師幫忙輔導一下。老師會教你一些寫作技巧。
  • 你有多久沒有陪孩子寫古詩了?
    也是通過這件事情,我才深刻的體會到了,教孩子看書,目的性不要太強,也不要強迫他做他不喜歡的事情。看著孩子拿著筆,在紙上胡亂塗鴉的時候,我忽然想到,既然他喜歡寫,為什麼不趁機教他認字呢?此前,我也一直在想,如何讓孩子對漢字感興趣,既然他對古詩感興趣,不妨就以古詩為「引」教他識字。
  • 《行屍走肉:第三季》directx error報錯解決方法
    導 讀 《行屍走肉第三季(行屍走肉:新防線)》遊戲錯誤directx error怎麼辦?
  • 「大神課堂」第三期:《九星天辰訣》作者教你寫遊戲
    寫好遊戲類小說的方法1,首先你必須喜歡玩遊戲,熟悉各種設定,規則,Bug。2,遊戲類和玄幻類差不多,只不過遊戲是數據,攻擊防禦都是一種數值,然後量化。小說作為純文字表達要激發讀者的想像力,適當留白,不要把文字寫的太滿了,過猶不及,有些劇情要靠猜。4,寫小說這三大要素:世界觀,代入感,人物塑造。5,新手作者們需要注意,遊戲是數據,但遊戲世界中的人物不可以是數據。一定要有性格才算是鮮活的人。除了性格以外,比如反派為什麼會變成反派?
  • 「不寫作業母慈子孝;一寫作業雞飛狗跳」這樣做讓孩子愛上寫作業
    網絡上有很多有關家長輔導孩子做作業的調侃:「不寫作業,母慈子孝;一寫作業,雞飛狗跳」;「輔導孩子寫作業的時候怎麼控制脾氣,要崩潰了」;「父親綁手輔導孩子寫作業,其他家長:同是天涯淪落人」......
  • C語言寫個貪吃蛇遊戲
    貪吃蛇是個非常經典的遊戲,用C語言來實現也是一個好玩的事情。這個遊戲我寫完後放在知乎,竟然點讚的人數超級多。我覺得大家喜歡,一個方面是因為寫得簡單,大家都能看得懂,一個可擴展性還是非常強的。setup用來設置參數,我們需要設置高度和寬度,還有分數,食物的位置。draw也就是畫,也就是畫整個畫面。還有一個枚舉類型 這個結構體用來設置蛇的幾個狀態,我覺得這個也是面向對象編程的一個思想,把蛇的狀態都封裝成一個枚舉類型。
  • 小學階段,寫作文是孩子的弱項,如何打消孩子寫作文的恐懼?
    玩笑話歸玩笑話,但這孩子每當提到寫作文時,就打退堂鼓,坐著快十分鐘了,還是不知道該如何下筆去寫一篇小作文?當然,為此家裡就從網上買了很多的書籍,都是關於如何寫好一篇作文,好作文100篇等等。在最開始讓孩子進行寫和複述的時候,這一點對於孩子而言,真的是太重要了。最開始讓孩子自己看完書後,來說說自己的一些感想,孩子其實是不適應,有些打怵的,那麼家長不要指責孩子,只需要鼓勵孩子,讓孩子將自己內心最想說的表達出來,哪怕是幾句話也不要緊。
  • 孩子總是寫反字,左右不分?是「感統失調」,用這5個小遊戲解決
    在綜藝節目《爸爸去哪兒》中陳小春的兒子Jasper,陳小春曾經在網上曬出他曾經寫的字,其中就把"小"字寫反了。相信有很多的孩子都存在這方面的問題,而也有許多的父母覺得這純粹是因為孩子左右不分。但其實,孩子總是寫反字不僅僅是因為左右不分,還有可能是孩子出現了感統失調的問題,父母千萬不能掉以輕心。
  • 讓孩子練字、報書法班到底有沒有用?為什麼孩子作業一寫快就亂?
    看到一位家長在網上的問題: 為什麼孩子練硬筆楷書快兩年了,作業還是一寫快就亂? 相信有不少人都是感同身受,小學生練字的時候,字寫得還像回事,但一寫作業就又快又亂,這種情況聽到周圍不少家長反映,包括我家孩子也有這樣類似的情況,只是每個孩子表現的輕重不同而已。 練字為什麼不管用?
  • 如何製造一個簡單的2D遊戲?
    除此之外,一些相對輕量的3D遊戲也可以考慮使用Unity開發,比如Monument Valley(紀念碑谷)、The ROOM(謎室)、Outer Wilds(星際拓荒)、The Almost Gone(憶落謎境)、Kerbal Space Program(坎巴拉太空計劃)等等。(上面舉例的遊戲都很好玩XD!感興趣可以玩玩看。(明日方舟也是用Unity開發的!(嘗試抓人入教.
  • 少兒遊戲編程:孩子學習遊戲編程有哪些好處?
    其中最頭疼的一部分人就是家長了:似乎真的沒有什麼有效的辦法來引導自己的孩子不沉迷手機遊戲。你不讓孩子玩手機吧,雖然能避免孩子沉迷遊戲,可是,在計算機的大時代背景下把孩子和計算機分割開來,似乎有點殘忍;要是放任孩子玩手機的話,孩子很有可能會因為沉迷手機遊戲而無法自拔,到時候就真的難受了。難道沒有什麼折中的辦法嗎?