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的過程

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

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

相關焦點

  • 正確的初始化,在 Java 編程中至關重要!
    今天,我打算聊聊Java編程中的初始化。使用構造器來確保對象初始化在Java編程中,無論是對象,還是基本類型,都不允許在未經初始化的情況下使用它們;否則,Java編譯器就會熱情地提醒你——請初始化後再使用
  • Github霸榜:從零開始學3D著色器編程
    主要介紹了通過使用Panda3D遊戲引擎和OpenGL著色語言來為3D遊戲添加紋理,法線貼圖,泛光,環境遮擋等等。教程內容十分豐富,動圖也非常生動。Shader,是運行在GPU上的程序,中文稱為著色器。它的主要用途是對三維物體進行著色處理,對光與影進行計算,以及控制紋理顏色的呈現等,最終,將遊戲引擎中的幾何數據轉化為屏幕上的模型、場景以及特效。
  • 3D遊戲編程:遊戲代碼的整體結構是什麼樣子的?
    為了能讓作為初學者的你學明白3D遊戲編程,我花費了17節的內容來講了一些「廢話」,只是希望你不要忽略這些「廢話」。3D遊戲編程實在是太複雜了,如果可以的話,我還想說一些更深層次的內容。但是我不能這麼做,過深的東西講得太多了,很容易「勸退」的。
  • scratch3.0圖形化編程軟體製作益智類小遊戲「直升機」
    說一下這個小遊戲的整個邏輯,直升機是我們控制的,通過按下/鬆開空格鍵來控制其上下運動的,按下空格鍵飛機上升,否則飛機下降,飛機只能在Y軸上垂直運動,遊戲過程中飛機躲過障礙物「得分+1」,如果碰到界面邊緣或障礙物遊戲結束。障礙物在隨機的高度(y軸)向左運動(使用克隆組件,出現間隔可以根據自己的喜好調整)。
  • 3D遊戲編程:Direct3D幫我們做了哪些事情?
    尤其是會寫3D遊戲的老程式設計師,目光是非常高的,他們甚至會看不起DirectX!DirectX的技術中,讓所有程式設計師都佩服的地方有兩個:其一,就是COM技術;其二,是DirectX虛擬了所有的硬體,讓遊戲編程不再考慮繁瑣的硬體控制。
  • ORB-SLAM3 單目地圖初始化(終結篇)
    歡迎大家一起交流成長~一、前言請閱讀本文之前最好把ORB-SLAM3的單目初始化過程再過一遍(ORB-SLAM3 細讀單目初始化過程(上)、超詳細解讀ORB-SLAM3單目初始化(下篇)),以提高學習效率。單目初始化過程中最重要的是兩個函數實現,分別是構建幀(Frame)和初始化(Track)。
  • 揭秘3D電影、遊戲角色的製作過程
    玩過遊戲,看過影視動漫的你有沒有好奇裡面的動畫角色或是人物怪獸是怎麼通知出來的呢?看上去效果那麼逼真。比如近兩年大火的遊戲《王者榮耀》裡面的人物、《陳情令》裡面的場景角色、國漫《哪吒之魔童降世》或是《姜子牙》等等,這些影視動漫在熒幕和手機上都是那樣的羽羽如生。那麼想要製作完整的3D電影或是遊戲角色人物或者場景的製作,這些過程又是怎麼製作出來的呢?
  • Scratch全國少兒編程競賽獲獎作品《遇見2030》解析
    《遇見2030》解析標籤:難度中級;遊戲;變量;廣播;場景切換;音樂互動;迷宮;未來;本文介紹的作品是全國青少年創意編程與智能設計大賽創意編程比賽一等獎獲得者齊梓棋同學的參賽作品。背景中初始化了車速變量的值,並循環播放遊戲的背景音樂。
  • 手機遊戲開發的編程軟體
    手機遊戲開發,說白了,也是經過編程軟體不斷地敲代碼敲出來的,但是呢,大家對於這門行業一直保持著好奇又疑惑地心理。對於一直從事軟體編程的人來說,這確實小兒科,但也不僅僅是小兒科,有時也相當於一座小山一般。因為,這既是一次很艱難的任務也是一件很輕鬆地旅程。
  • 自考計算機應用技術知識點:可編程接口晶片
    可編程接口晶片及其應用(一)學習目的與要求本章學習的主要內容是可編程序並行接口晶片8255A、可編程定時器/計數器8253-5和通用同步異步接收發送器8251A的組成、功能和應用。模/數轉換器ADC0809的工作原理和應用。
  • 哪些棋牌遊戲編程軟體是你不了解的?
    對於棋牌遊戲編程,其實大家一直保持著好奇又疑惑的心理。對眾多做棋牌遊戲編程軟體的人來說,這既是一次很艱難的任務也是一次很輕鬆的旅程。棋牌遊戲編程軟體應該怎麼做,應該在製作過程中規避一些什麼樣的風險,和小編一起來聊聊。
  • Scratch編程19:如何用畫筆積木畫複雜的圖案
    2)程序設計第一步:初始化畫筆。將畫布擦除乾淨,設置筆尖粗細。第二步:選擇起點。我們可以把圖形的中心點設為起點。從起點畫四邊形剛好回到起點。第三步:設置首次畫圖方向。圖4對於程式語言,顏色其實是用數字作為代號的,只不過為了方便,作為圖形化編程軟體,Scratch可以直接顯示顏色,這樣可以讓編程者更直觀的選擇顏色(圖5)。
  • 使用scratch圖形化編程軟體製作打地鼠小遊戲
    打地鼠這個小遊戲貌似比我的年齡都要大,這次我們使用scratch3.0圖形化編程軟體來製作一款我們自己的「打地鼠」。手機遊戲界面截圖我們先準備4樣角色,分別是:地鼠角色、錘子角色、地洞角色、草地角色。角色Broom腳本:不用初始化位置(因為是跟著「滑鼠指針」的);「移到最前面」這個語句塊我們是第一次用,由於我們的軟體是一個二維軟體,我們只能通過「層」的疊加來表達角色位置,後面的學習我們會繼續接觸的;按下滑鼠時候是「砸下」的造型,沒有按下時候是「舉著」的造型,(大家還可以使用運動模塊中
  • PaddlePaddle 2.0.0 Beta 發布,API 體系升級,命令式編程完善
    PaddlePaddle 2.0.0 Beta 已經發布,這是飛槳框架v2.0的測試版,最重要的變化為API體系的全面升級以及命令式編程
  • 不可錯過的Scratch積木編程——塔防戰
    Scratch 遊戲編程課程——登陸戰【遊戲描述】一款塔防類射擊小遊戲,玩家操作一門可旋轉的炮打掉從海中登陸的士兵,一旦士兵接觸到炮塔,意味攻破了你的防守,遊戲結束。【遊戲設計思路】1.炮塔在固定位置,隨滑鼠轉動。2.點擊滑鼠發射炮彈。3.敵人士兵移動速度不一樣。4.體現打中後爆炸效果。
  • 遊戲3d建模師好找工作嗎?工資待遇怎麼樣?
    學遊戲3d建模未來好找工作嗎?待遇怎麼樣?今天小編攜遊藝網(game798)的柱子老師來給大家簡單分析一下目前國內遊戲3d建模市場概況以及未來遊戲3d建模師發展前景,希望能給大家提供一些幫助。隨著國家文化政策的大力支持,我國文化娛樂產業蓬勃發展,生活水平的不斷提高促使人們也越來越願意在精神享受上花錢,我國遊戲行業的快速發展直接帶動了遊戲3D建模師的大量需求。& 學遊戲3d建模好找工作嗎?
  • 玩遊戲也可以學編程?
    玩家通過輸入代碼控制英雄角色,遊戲過程中面臨編程挑戰,挑戰成功將解鎖下一關卡並獲得經驗點,並可以提升英雄能力。JavaScript、CoffeeScript、Lua、Python和Clojure。該遊戲涵蓋了編程基本語法、循環、字符串、變量、方法調用、矢量繪圖等主題。遊戲目前共有五個章節,每個章節各有十幾至幾十個主線及獎勵關,編程難度由低到高,所需要的技能都在每個關卡中有說明,並配有詳細的注釋及提示,易於上手。界面左邊是模擬器/戰鬥界面,左上方有關卡目標的提示,右上方為代碼編寫區域,可以自行選擇語言種類以及設置編輯器,右下方為代碼庫以及提示區。界面整體畫面清晰,易於操作。
  • 核桃編程是不是也是一場資本遊戲?
    少兒編程是什麼?   少兒編程教育是通過編程遊戲啟蒙、可視化圖形編程等課程,培養低齡學生的計算思維和創新解難能力的課程   。   多數情況下針對5—18歲的少年兒童開展的編程教育,目前,最常見的形式是線上和線下模式相結合的課外培訓。
  • 3D圖形編程屆的扛把子「OpenGL」到底厲害在哪?
    大家可能對圖形編程有些陌生,往小了說,我們在計算機或手機上玩遊戲時,看到的一些3D特效,都是通過圖形編程實現的。往大了說,無論是Windows、iOS還是Android,能看到的界面本身就是圖形編程的傑作。
  • Scratch編程趣味篇(二十五)-闖關躲避球-遊戲篇
    第二步:程序搭建(1)Pico walking角色程序 1)程序初始化建群的初心是為了大家方便進行Scratch編程問題交流,希望大家能自覺遵守國家的法律,文明交流。