国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于C++和DirectX技術(shù)的3D 游戲引擎開發(fā)

2015-12-17 01:53王昌建
電腦知識與技術(shù) 2015年28期
關(guān)鍵詞:碰撞檢測引擎內(nèi)存

王昌建

摘要:如今的電子游戲風(fēng)靡世界,無論什么大型的游戲都是基于游戲引擎設(shè)計和開發(fā)出來的。該文對游戲引擎的各個功能進行了詳細的闡述,并使用C++程序設(shè)計語言實現(xiàn)了游戲引擎中內(nèi)存池管理、文件管理、圖形控制系統(tǒng)、渲染器、物理系統(tǒng)、媒體系統(tǒng)、輸入控制系統(tǒng)等主要功能。

關(guān)鍵詞:C++; DirectX;游戲引擎

中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2015)27-0064-03

1 游戲引擎概述

1.1 什么是游戲引擎

電子游戲中玩家所體驗到的劇情、關(guān)卡、美工、音樂、操作等內(nèi)容都是由游戲的引擎直接控制的,它扮演著中場發(fā)動機的角色,把游戲中的所有元素捆綁在一起,在后臺指揮它們同時、有序地工作。簡單地說,引擎就是用于控制所有游戲功能的主程序,從計算碰撞、物理系統(tǒng)和物體的相對位置,到接受玩家的輸入,以及按照正確的音量輸出聲音等。

1.2 游戲引擎介紹

游戲引擎是負責(zé)與系統(tǒng)底層聯(lián)絡(luò)的一套程序規(guī)范,游戲的效果很大程度取決于游戲引擎的好壞。一款好的游戲引擎所帶來的畫面沖擊感和游戲流暢度,對于一個游戲的生命周期來說是至關(guān)重要的。

1.3目前主流游戲引擎簡介

CryEngine由德國Crytek開發(fā),主要的游戲產(chǎn)品是《孤島危機》,《孤島危機:彈頭》,《藍色火星》等。Gamebryo由Numerical Design Limited與Emergent Game Technologies公司開發(fā),主要的游戲產(chǎn)品是《上古卷軸Ⅳ》,《輻射3》,《魔界2》等。用BigWorld引擎制作的游戲主要有《北斗神拳OL》,《天下2》,《星門世界》,《三國群英傳online2》,《傳世西游》,《崢嶸天下》,《格蘭蒂亞OL》,《鬼吹燈OL》等。此外還有Epic Games公司的Unreal Engine、Criterion Software公司的RenderWare以及開源免費的Ogre引擎等。

2游戲引擎各模塊介紹

游戲引擎一般應(yīng)包含以下系統(tǒng):渲染引擎(即“渲染器”,含二維圖像引擎和三維圖像引擎)、物理引擎、碰撞檢測系統(tǒng)、音效、腳本引擎、人工智能、網(wǎng)絡(luò)引擎以及場景管理。

2.1渲染器

在Windows平臺下的渲染器主要就是DirectX 3D。DirectX是一種應(yīng)用程序接口(API),是計算機計算圖形的一種規(guī)則。它可以讓W(xué)indows為平臺的游戲或多媒體程序獲得更高的執(zhí)行效率,在這個規(guī)則中大量包含著現(xiàn)實實例的抽象集合,意味著它具有強大的靈活性和多態(tài)性。然而其抽象主要表現(xiàn)在參數(shù)的自定義和運算結(jié)構(gòu)的隨意組合,但其運算結(jié)構(gòu)的堅固(獨特/固定的運算規(guī)則)也使其具有很強的穩(wěn)定性。DirectX加強3D圖形和聲音效果,并提供設(shè)計人員一個共同的硬件驅(qū)動標準,讓游戲開發(fā)者不必為每一品牌的硬件來寫不同的驅(qū)動程序,也降低用戶安裝及設(shè)置硬件的復(fù)雜度。

2.2物理引擎

目前在游戲里被大量普遍應(yīng)用的物理引擎有兩種,分別是Ageia開發(fā)的PhysX以及Havok的Havok系列引擎。

PhysX 是原AGEIA公司開發(fā)的一套物理運算引擎,主要競爭對手是Havok。同Havok一樣,Physx也可運用在Xbox360,Playstation3,PC,Mac等多種平臺之上。Physx的另外一個優(yōu)勢是可以運用獨立的浮點處理器(包括獨立的物理加速卡和GPU)進行更為復(fù)雜的運算效果,同時減輕CPU的計算負擔(dān)。Havok成立于1998年,主要為游戲開發(fā)商提供物理仿真技術(shù),從而使對象能夠以更加真實的狀態(tài)展現(xiàn)。

2.3音頻引擎

目前主流的音頻引擎為FMOD。 聲音系統(tǒng)是為游戲開發(fā)者準備的革命性音頻引擎。采用了FMOD作為音頻引擎的游戲包括Far Cry(孤島驚魂)、Tom Clancy's Ghost Recon(幽靈行動),甚至著名的World Of Warcraft(魔獸爭霸)等。

2.4腳本引擎

主流的腳本語言有perl,lua,ruby。游戲中一般使用的腳本語言是lua,因為lua體積小、開源、執(zhí)行速度快,語法也比較簡單。例如魔獸爭霸用的腳本就是lua,網(wǎng)游中的任務(wù)也一般是lua。

2.5人工智能

人工智能就其本質(zhì)而言,是對人的思維的信息過程的模擬。人工智能是一門前沿交叉學(xué)科,屬于自然科學(xué)和社會學(xué)科的交叉。網(wǎng)游中用到的并不多,一般就應(yīng)用在怪物發(fā)現(xiàn)玩家在附近就主動攻擊等場景中,在格斗類游戲中,就是對玩家出招,進行相應(yīng)的反擊操作。

2.6網(wǎng)絡(luò)引擎

網(wǎng)絡(luò)引擎主要職責(zé)是負責(zé)數(shù)據(jù)傳輸,保證數(shù)據(jù)的穩(wěn)定性。ace是一個比較有名的開源網(wǎng)絡(luò)通訊庫,而且跨平臺。

2.7場景管理

場景管理是對數(shù)據(jù)進行有序的組織和管理?,F(xiàn)在的游戲動不動就10G以上,如果沒有一個有效的數(shù)據(jù)管理就不行了,如何在適當時候加載相應(yīng)資源,一些資源不需要了,就從內(nèi)存中釋放掉,從而能夠保證內(nèi)存空間足夠,這是相當重要的。

3基于C++的游戲引擎開發(fā)

3.1核心模塊:內(nèi)存池管理系統(tǒng)

內(nèi)存管理在C++中相當重要,如果內(nèi)存處理,稍有不慎都有可能導(dǎo)致內(nèi)存泄漏。而且頻繁的申請內(nèi)存,釋放內(nèi)存,都會造成內(nèi)存碎片,時間長了可能導(dǎo)致申請內(nèi)存失敗。如果使用內(nèi)存池,就可以很好的管理內(nèi)存,更可以有效地減少內(nèi)存碎片,而且可以有更快的速度申請釋放內(nèi)存。

內(nèi)存管理方式如圖1所示,首先向系統(tǒng)申請一塊較大的內(nèi)存,設(shè)置內(nèi)存塊頭標志,并存入內(nèi)存池鏈表中進行管理,每次向內(nèi)存池,都先向內(nèi)存池頭中搜索,如果有足夠的空間,就從當前內(nèi)存池中獲取空閑空間,并設(shè)置相應(yīng)地頭標記。但是如果空間不夠,就創(chuàng)建新的內(nèi)存池,并存入鏈表中進行管理。但是如果都用相同級別內(nèi)存池大小,可能會造成很多的內(nèi)存浪費,可以創(chuàng)建多個級別內(nèi)存池,每個級別用不同大小,在申請內(nèi)存時候,可以根據(jù)申請的精度,自動匹配到相應(yīng)的級別進行搜索獲取相應(yīng)的內(nèi)存,這樣可以減少內(nèi)存浪費,增加內(nèi)存池利用率。

3.2核心模塊:文件管理系統(tǒng)

商業(yè)游戲中用到的圖片、聲音很少直接赤裸裸的放在文件夾中,不進行任何的打包和加密,一般都有自己的一套文件格式,內(nèi)部進行壓縮加密。如果不進行良好管理,則很難進行維護,而且資源也不安全,可能被別人利用。而一套文件管理,既可以保密自己的資源不被別人利用,而且可以減少了資源占用空間。

文件系統(tǒng)的實現(xiàn)方式如圖2所示,首先有個文件系統(tǒng)頭信息,里面記錄當前文件的信息,包括指向第一個文件夾,第一個文件的信息,通過訪問第一個文件夾的頭數(shù)據(jù),可以繼續(xù)查詢到下一個文件夾信息,指向的文件信息,指向第一個子文件夾信息。訪問文件數(shù)據(jù)頭時候,可以取到數(shù)據(jù)的頭信息和數(shù)據(jù)。使用鏈表方式管理所有數(shù)據(jù),進入可以自由添加刪除文件系統(tǒng)內(nèi)的所有數(shù)據(jù)。

3.3核心模塊:圖形控制系統(tǒng)

不相同的2個點構(gòu)成線,不共線的3個點組成了面。所以面是3D的基本元素。圖形系統(tǒng)由場景、資源管理(紋理管理,靜態(tài)模型管理,動態(tài)模型管理,渲染狀態(tài)管理)、攝像機,地形,天空盒,天空球,靜態(tài)模型,骨骼動畫,紋理貼圖,材質(zhì),霧化處理,燈光,粒子系統(tǒng),文字系統(tǒng)等組成。

3.4引擎模塊:渲染器

渲染器,是專門針對各個平臺的操作系統(tǒng),而定植的。目前很多游戲都提供了多種渲染器(DirectX,OpenGL,Software),甚至是多種平臺(Windows,Linux,mac)。Ogre中,就是將渲染器做成了插件的形式,根據(jù)需要,加載DirectX的渲染器,還是加載OpenGL的渲染器,從而可以有更好的適應(yīng)性。而Software,則是純軟件模擬的,所有的渲染狀態(tài),混合處理,坐標轉(zhuǎn)換,全部都自己用算法實現(xiàn),而不是考DirectX和OpenGL內(nèi)部已經(jīng)幫你處理好。

3.5引擎模塊:物理系統(tǒng)

物理系統(tǒng),是一個純邏輯,算法的模塊,內(nèi)部封裝的各種復(fù)雜的處理算法,并提供簡單的接口,本引擎目前只完成了八叉樹碰撞檢測系統(tǒng)。游戲中碰撞檢測導(dǎo)出可見,若是沒有碰撞檢測,那玩家變的飛檐走壁,可以橫穿各個物體。有了碰撞檢測,就能很好地限定在指定允許的范圍內(nèi)行動。在2D小游戲中的方法,簡單地用是數(shù)組來的碰撞物體,人物行走很,可以簡單的跟數(shù)組中的值進行判斷即可,而在3D中就行不通了,三維游戲中場景特別大,就得用特別是算法來實現(xiàn)了。

3.6引擎模塊:媒體系統(tǒng)

游戲中若是一點聲音都沒用那將是多么枯燥,背景音樂能夠體現(xiàn)一個游戲的主題,類型,打斗的場面,會有刀劍的聲音。背景音樂用到時高保真音樂,用于播放背景音樂,且不頻繁切換,由于加載時間比較長。音效,是使用了硬件緩沖區(qū)的接口,能夠快速播放音效,缺點是質(zhì)量不高,但是速度能足夠快,一樣用于游戲中打斗聲音,開門聲等。三維音效,像CS中的音效一樣,通過判斷聲音,能夠辨別出聲音發(fā)出的方位,是比較真實的模擬音效。缺點是比較耗資源,運算量比較大,通過多普勒定理算出的。

3.7引擎模塊:輸入控制系統(tǒng)

游戲都是互動的,不可能全部由計算機執(zhí)行,而不用玩家參與,用戶反饋就顯得相當?shù)闹匾?。目前pc機上的輸入設(shè)備主要有鼠標,鍵盤。因此鼠標和鍵盤成了用戶與計算機交流的通道。游戲中也是,玩家通過控制鼠標,鍵盤可以控制游戲中人人物馳騁沙場。Windows系統(tǒng)中的,獲取輸入消息,可以通過Windows消息隊列,也可以用API函數(shù)。Windows消息隊列缺點是相應(yīng)的速度不夠快(相對于競技類游戲),API也是一樣。dinput就很好地解決了這個問題,dinput直接與硬件打交道,可以直接獲取硬件狀態(tài)。dinput中獲取數(shù)據(jù)狀態(tài)有2中模式,緩沖模式和即時模式。緩沖模式,是只有當狀態(tài)發(fā)生變化的時候才有消息(如果在短時間發(fā)生的多次消息會存到dinput消息隊列中),即時模式是獲取當前的狀態(tài)(中間發(fā)生的多次消息將被忽略)。一般游戲都會用緩沖模式,應(yīng)為他獲取的值更加準確可靠。

3.8 引擎模塊:輔助系統(tǒng)

一般一個引擎都有一套自己的庫文件系統(tǒng),內(nèi)部自己實現(xiàn)一套數(shù)學(xué)庫,復(fù)雜的運算函數(shù),字符處理,等待都是為了擴平臺做前提。本文設(shè)計的引擎輔助系統(tǒng),目前僅僅完成幾個簡單的字符處理,ANSI與Unicode字符轉(zhuǎn)換,自定義的一套類型。

3.9 引擎各模塊聯(lián)系

本文設(shè)計的引擎各個部分靜態(tài)結(jié)構(gòu)圖如圖3所示。

MdMemory內(nèi)存池,是本文設(shè)計的引擎的核心部分,負責(zé)管理內(nèi)存。其它對象都是通過內(nèi)存池來獲取相應(yīng)內(nèi)存,這樣保證了所有對象數(shù)據(jù)都在內(nèi)存池的管理之中,由內(nèi)存池進行了統(tǒng)一的管理。內(nèi)存池在析構(gòu)時候進行了檢測是否發(fā)生泄露,并提示在那個文件第幾行代碼發(fā)發(fā)生的,并有一個專門的值,可供設(shè)置斷點使用,在下次啟動時候自動中斷在泄露的位置,然后通過編譯器的調(diào)用堆棧查看,可以快速看出問題的所在,大大的簡化的各個模塊內(nèi)存使用的情況。文件系統(tǒng),內(nèi)部使用了內(nèi)存池接口,并使用了一套文件夾頭,文件頭信息緩沖機制,由于采用路徑訪問方式,要訪問子路徑中的文件,就必須先訪問文件夾信息,通過一個緩沖方式儲存在內(nèi)存池中,比直接從硬盤加載,查詢的速度快了很多,而查詢緩沖數(shù)據(jù),用了哈希算法,快速定位,并有個最長時間未使用的記錄,把長時間不使用的信息移除,保證了緩沖的高效使用機制。內(nèi)部實現(xiàn)了加密算法,保證了數(shù)據(jù)的安全,杜絕的數(shù)據(jù)被竊取。圖形系統(tǒng),是包含了所有3D圖形的算法,實現(xiàn),內(nèi)部封裝了各種復(fù)雜的實現(xiàn)算法,并提供一套簡單的接口,而且和文件系統(tǒng)關(guān)聯(lián),加載數(shù)據(jù)可以直接從文件系統(tǒng)獲取,避免所使用到的資源裸露在外頭。內(nèi)部對各種資源的頭數(shù)據(jù)進行了擴展,方面圖形信息直接使用,而不用計算配置后使用,使之能快速有效。圖形系統(tǒng)的渲染接口用了渲染器的接口,在Windows系統(tǒng)下,可以像ogre一樣可以自由切換DirectX9或OpenGL來渲染。圖形系統(tǒng)中,用到的碰撞檢測調(diào)用物理系統(tǒng)完成,集合到圖形系統(tǒng)的場景管理中,可以無需外部特別的處理,可以方便有效的實現(xiàn)碰撞檢測系統(tǒng)。

4 總結(jié)

本文介紹了3D游戲引擎的各個組成部分,并使用C++語言實現(xiàn)了一個能夠完成基本3D功能的游戲引擎。經(jīng)過測試,基于該引擎能夠開發(fā)一些中小型游戲產(chǎn)品,并且該引擎是開源免費的,對理解游戲引擎的原理有一定的作用。

參考文獻:

[1] Matt Pharr.Gpu Gems 2:Programming Techniques for High - Performance Graphics and General-Purpose Computation[M].Nvidia,2005.

[2] David H.Eberly.3D Game Engine Design: A Practical Approach to Real-Time Computer Graphics Second Edition[M].北京: 人民郵電出版社,2009.

[3] Jim Adams.Advanced Animation with DirectX[M].Course Technology PTR,2005.

猜你喜歡
碰撞檢測引擎內(nèi)存
全新預(yù)測碰撞檢測系統(tǒng)
外部高速緩存與非易失內(nèi)存結(jié)合的混合內(nèi)存體系結(jié)構(gòu)特性評測
基于BIM的鐵路信號室外設(shè)備布置與碰撞檢測方法
“春夏秋冬”的內(nèi)存
Unity3D中碰撞檢測問題的研究
藍谷: “涉藍”新引擎
BIM技術(shù)下的某辦公樓項目管線碰撞檢測
無形的引擎
基于Cocos2d引擎的PuzzleGame開發(fā)
基于內(nèi)存的地理信息訪問技術(shù)