3D遊戲編程:初始化Direct3D的過程

2020-12-21 我是遊戲小胡

通過前面的課程,你已經對遊戲編程有了一個整體上的認識,就算不知道細節,但也足夠你出去「侃大山」了。從這一節內容開始,我們將要深入3D遊戲編程的細節。如果遊戲編程是一個複雜的機器,前面的課程已經幫你窺得全貌了,現在的你,只是機器中的原理和細節不太明白。

從現在開始,我們就開始講解這個機器中的原理和細節,內容比較多,也比較難理解,希望你多花點時間去「悟」。

我們是用Direct3D來處理示例程序中的3D世界的部分的,所以,我們必須在程序代碼中使用Direct3D。

由於DirectX是COM組件,它和函數庫中的函數不一樣,並不能直接使用,必須先初始化了才可以用。

我們在使用函數庫的時候,只需要直接調用函數就可以了,並沒有一個初始化的過程。比方說Windows框架代碼中,我們是直接使用CreateWindow來創建窗口的,並沒有初始化的過程。那麼,COM組件為什麼那麼特殊?非要初始化呢?

因為,COM組件是組件,它不是原始的代碼。

「學」的部分

繼續之前,請你再次熟悉Windows框架的內容,接下來的所有代碼,都是在這個框架的基礎上添加的。

一、遊戲代碼的運行過程

通過前面一些章節的講述,我想,你應該已經充分懂得了虛擬3D世界的大致內容,但是,那都是理論性的東西,主要是為了幫助你理解實踐中的代碼的。現在,我們要開始在框架的基礎上編寫遊戲代碼了。首先,我們要明白一個小問題:遊戲代碼是如何運行的呢?

我們已經知道,3D遊戲的過程是先創建一個虛擬的3D環境,然後把一切的東西添加進去後,再通過虛擬攝像機把虛擬場景轉化為2D圖像並顯示出來。這個過程在前面已經強調多次了,那麼,如何在代碼中體現這個過程呢?

為了加深你的理解,我把思考的過程寫出來。

通過練習Windows框架的編寫,你應該要總結出如下的一些編程基礎內容:

①程序是一行一行執行代碼的;

②當程序執行到最後一行代碼的時候,程序會結束

③Windows框架代碼中,我們通過消息循環的方式來延緩程序結束的時間,讓窗口可以長時間的存在,用戶需要通過關閉按鈕才能結束消息循環,才能結束程序

我們再延伸一下,如果我們把顯示出來的窗口當成一個「遊戲」的話,那麼,在消息循環之前的所有代碼都是為了這個「遊戲」做的準備工作,而消息循環的目的是為了「遊戲」可以長時間的存在。

也就是說,我們把虛擬攝像機拍攝的2D圖片放在消息循環中,那麼,虛擬的3D世界就能長時間存在於窗口中了。

遊戲的運行過程就是模仿這個消息循環的工作機制,整體來說是分成了2個步驟:

(1)在消息循環之前,把虛擬3D環境所要用到的所有內容都準備好,這樣,我們在消息循環中玩遊戲的時候,就不會因為有什麼東西沒有加載好而感覺到卡了;這個過程有一個專業術語——遊戲的初始化

(2)遊戲初始化完畢之後,我們就可以在消息循環中把2D圖片顯示在窗口中了,由於是一個循環,這也有一個專業術語——遊戲循環;遊戲循環的目的,是把當前時間的3D世界轉化成2D圖像;由於消息循環會一直運行,2D圖像就會一直更新並顯示,我們在窗口中就能像看電影那樣看到遊戲畫面了。

我們繼續延伸一下

每一個遊戲循環中,要處理的事情很多,計算機不可能立馬就計算完畢,程序執行完畢一個遊戲循環,需要消耗一定的時間t。而t是當前計算機計算出一個遊戲2D畫面所需要的時間,這個遊戲2D畫面也有專業術語——幀。

一般來說,t的單位是毫秒,我們用1000除以t,就得到了當前計算機運行這個遊戲程序的幀數。遊戲想要運行起來,最低的幀數是15,但是15幀的遊戲會有點卡。遊戲想要不卡,幀數要在30以上。

在很久以前,普遍的家用計算機性能都不怎麼樣,遊戲程式設計師都會想辦法把幀數控制在30,這樣,遊戲就不會卡了。而現在,由於計算機的性能飆升,所以,遊戲程式設計師再也不用管幀數的問題了,一般來說都不會限制幀數,只要你的計算機性能好,一個大型3A遊戲也能達到1000幀的水平。

扯遠了。

總結一下,遊戲代碼運行的重點是:

①在消息循環之前,把所有需要的內容都初始化好;

②在消息循環中,再把場景轉化成2D圖像(幀)並顯示出來。

二、初始化Direct3D的過程

我們已經知道,要在消息循環之前把遊戲的內容初始化好,那麼,究竟應該在什麼位置放置初始化的代碼呢?

答案可能出乎很多新手的預料:可以在任何地方進行遊戲的初始化,只要別在消息循環當中或者之後就行。

相關焦點

  • Mybatis初始化過程簡單總結
    前面連續多篇文章都是在數據mybatis的初始化過程,目前基本完成,是時候做一個總結了。總覽首先回顧下最上層的測試代碼,實際上目前分析的還在測試代碼中與mybatis相關的第一步,具體如下圖:目前還在構建SqlSessionFactory這行代碼,這行代碼涉及了很多流程,前面也分析了很多,這裡把分析的主要流程總結如下圖:上圖中只畫出了SqlSessionFactory初始化過程以及
  • 面試問題類初始化過程與對象分配過程
    類的初始化過程和對象分配過程也是面試中經常問的問題,如果能夠清晰的回答出來必定漲分不少。類初始化過程對象的初始化包含了類加載過程,所以這裡相當於是講類的加載過程,類加載過程分為7步:加載、驗證、準備、解析、初始化、使用、卸載;首先第一步加載過程就是通過類的權限定名稱獲取類的二進位流,JVM把二進位流文件中存儲的靜態結構轉化成方法區運行時數據結構
  • Github霸榜:從零開始學3D著色器編程
    主要介紹了通過使用Panda3D遊戲引擎和OpenGL著色語言來為3D遊戲添加紋理,法線貼圖,泛光,環境遮擋等等。教程內容十分豐富,動圖也非常生動。Shader,是運行在GPU上的程序,中文稱為著色器。它的主要用途是對三維物體進行著色處理,對光與影進行計算,以及控制紋理顏色的呈現等,最終,將遊戲引擎中的幾何數據轉化為屏幕上的模型、場景以及特效。
  • 3D遊戲編程:Direct3D幫我們做了哪些事情?
    尤其是會寫3D遊戲的老程式設計師,目光是非常高的,他們甚至會看不起DirectX!DirectX的技術中,讓所有程式設計師都佩服的地方有兩個:其一,就是COM技術;其二,是DirectX虛擬了所有的硬體,讓遊戲編程不再考慮繁瑣的硬體控制。
  • ORB-SLAM3 單目地圖初始化(終結篇)
    歡迎大家一起交流成長~一、前言請閱讀本文之前最好把ORB-SLAM3的單目初始化過程再過一遍(ORB-SLAM3 細讀單目初始化過程(上)、超詳細解讀ORB-SLAM3單目初始化(下篇)),以提高學習效率。單目初始化過程中最重要的是兩個函數實現,分別是構建幀(Frame)和初始化(Track)。
  • 少兒遊戲編程:孩子學習遊戲編程有哪些好處?
    而且我發現,從小學習計算機編程好處非常多,不僅能提高思維能力,提高專注力,還能有效避免沉迷遊戲。那麼,一個小孩或者說是少年,學習遊戲編程具體有哪些好處呢?一、不容易沉迷遊戲不是說學習了遊戲編程之後就不會沉迷遊戲,而是沉迷遊戲的概率會降低。
  • 一招提高你的3D列印技巧
    G代碼是連接電腦和3d印表機的「橋梁」,利用G代碼,我們可以通過電腦「告訴」3d印表機什麼時候列印,在哪兒列印,如何移動,擠出多少等。    這是因為,了解G代碼的你可以很好的充當印表機的故障檢測員,控制列印過程的各個方面,在故障發生前就可以識別並防止列印失敗。  聽起來是不是很有趣?下面讓我們一起來看看如何看懂並理解G代碼、如何自己編寫代碼並在線測試、如何使用切片的G代碼預覽功能來解決複雜的版畫~  一、什麼是G代碼?  G代碼代表「幾何碼」。
  • Python for Mac(Python編程工具)
    Python for Mac是Mac系統上的一款Python編程平臺,由IDLE與Python Launcher兩部分組成。Python是一種極其通用,動態,可解釋和通用的語言,也是當今最受歡迎和最受歡迎的程式語言之一。歡迎需要的朋友前來macz下載使用。
  • 是不是覺得國產3D動漫崛起了,但你知道3D動漫的製作過程嗎?
    方法/步驟1:我們首先來了解一下,3d動畫的定義。、3D建模、3Dsmax、Zbrush、Maya、動漫建模、遊戲模型、建模學習、建模教程方法/步驟2:3d視頻製作——步驟一:建 模建模需要有建模軟體,常用的有:Autodesk-
  • 免費學編程!《瘋狂兔子:編程學院》遊戲推薦
    並沒有接觸實際編程語法,只是了解其編程大致與非邏輯。  所以與其花大價錢進行基礎邏輯學習還不來看看這個育碧旗下免費遊戲的《瘋狂兔子:編程學院》呢?而根據育碧此遊戲開發總監的說法:「《瘋狂兔子:編程學院》旨在使編程變得有趣且讓所有人都可以輕鬆了解,並表明它實際上並不那麼複雜。我們已經創建了手冊,以便該遊戲可以在學校中供兒童或成人使用。藉助手冊,您可以在學校或與孩子一起在家上課。這是探索編程邏輯的一種非常簡單易行的方法。」
  • 教孩子寫遊戲:矩陣在3D遊戲編程中是如何被使用的?
    好了,大致了解了前因後果之後,我們來看一看矩陣在3D遊戲編程中到底怎麼用吧。一、虛擬3D中的3D物體需要有哪些操作?我們再簡單複習一下遊戲中的3D世界。這個過程中,第二步是處理3D物體的過程,現在,我們稍微深入了解一下。假設,我們要在3D世界中加入一輛小汽車,並讓小汽車停在預定的停車位中。我們要如何解決這個問題呢?其實,方法挺容易的。1.用3D軟體創造一個小汽車的模型,並按照一定規則導入到我們的程序中。
  • 手機遊戲開發的編程軟體
    手機遊戲開發,說白了,也是經過編程軟體不斷地敲代碼敲出來的,但是呢,大家對於這門行業一直保持著好奇又疑惑地心理。對於一直從事軟體編程的人來說,這確實小兒科,但也不僅僅是小兒科,有時也相當於一座小山一般。因為,這既是一次很艱難的任務也是一件很輕鬆地旅程。
  • 為什麼帕拉卡3D動畫編程學習要從搭建開始?
    圖形化編程階段,學生不需要輸入代碼,只需要用滑鼠拖動積木就能比較輕鬆地完成編程,製作出生動有趣的動畫和遊戲。圖形化編程工具當初被發明,靈感就是來源於樂高積木搭建創造的設計精華。然後我們再看看下面圖1右側所示圖塊式編程的截圖,就很形象的可以看出來許多的指令搭建出來一段程序。
  • 教孩子寫遊戲:3D遊戲編程的必備數學知識,理解三維空間向量
    那麼,不學可不可以寫出3D遊戲來呢?其實是可以的。市面上有太多的3D遊戲引擎了,這些3D引擎把遊戲編程中比較複雜的工作都幫我們做了,只是把一些比較簡單的工作留給了我們。這樣的話,只需要點幾下滑鼠,添加一些遊戲素材,像本課程這樣的3D遊戲示例一下子就能生成很多個。但是,真的用遊戲引擎的話,不管是新手還是孩子,一點有用的東西都學不到。
  • 「原創」Java並發編程系列02|並發編程三大核心問題
    要快速準確的發現並解決這些問題,首先就是要弄清並發編程的本質,並發編程要解決的是什麼問題。本文將帶你深入理解並發編程要解決的三大問題:原子性、可見性、有序性。補充知識硬體的發展中,一直存在一個矛盾,CPU、內存、I/O設備的速度差異。
  • 三菱PLC編程軟體及安裝步驟
    三菱軟體類型:1、三菱PLC編程軟體:GX Developer(不帶仿真軟體)、GX WORKS2(自帶仿真軟體)、GX WORKS3(最新版軟體)2、三菱PLC仿真軟體:GX安裝過程中輸入姓名和公司名稱,隨意輸入。輸入產品序列號選擇部件。
  • PaddlePaddle 2.0.0 Beta 發布,API 體系升級,命令式編程完善
    PaddlePaddle 2.0.0 Beta 已經發布,這是飛槳框架v2.0的測試版,最重要的變化為API體系的全面升級以及命令式編程(動態圖)能力的全面完善。
  • 遊戲3d建模師好找工作嗎?工資待遇怎麼樣?
    學遊戲3d建模未來好找工作嗎?待遇怎麼樣?今天小編攜遊藝網(game798)的柱子老師來給大家簡單分析一下目前國內遊戲3d建模市場概況以及未來遊戲3d建模師發展前景,希望能給大家提供一些幫助。隨著國家文化政策的大力支持,我國文化娛樂產業蓬勃發展,生活水平的不斷提高促使人們也越來越願意在精神享受上花錢,我國遊戲行業的快速發展直接帶動了遊戲3D建模師的大量需求。& 學遊戲3d建模好找工作嗎?
  • 帕拉卡(Paracraft)3D動畫編程為什麼比Scratch更受學生歡迎?
    問題3:基於Scratch的少兒編程學習周期性太短,學生進階就要學習新的Python程式語言,部分學生會在轉化的過程中流失;問題4:機構想要做不一樣的課程,但是受制於工具都是在固定的Scratch編程工具的框架下,受到了很大的局限,能進行創新衍生的教學點和教學方式都十分有限。
  • 主流遊戲引擎都是用什麼語言來開發?
    1.unity 3d這是目前最火的遊戲引擎之一,像王者榮耀和仙劍六都是unity 3d開發的,這個引擎開發效率很高。這個引擎要用C#來開發。2.虛幻引擎如果說unity 3d是第一的遊戲引擎的話,那虛幻引擎能稱第二。這是一個開源的引擎,它製作的遊戲在畫質上比unity 3d精美的多,但開發效率不如unity 3d。《絕地求生》就是這個引擎開發的。