• 沒有找到結果。

技術背景

在文檔中 虛擬寵物與市場設計實作 (頁 8-14)

第二章 虛擬寵物遊戲介紹

2.3 技術背景

DirectX 是一種介於電腦硬體跟 Windows 程式之間協商溝通的軟 體,由於電腦週邊硬體的種類、製造商很多,所以微軟就開發了這套 DirectX 協商溝通軟體,讓硬體廠商所製造出來的電腦硬體能夠直接支 援 DirectX 所提供的功能,而軟體設計廠商也可以不用管硬體廠商的 硬體規格,直接使用 DirectX 所提供的一切功能設計多媒體軟體。所 以,目前許多的電腦遊戲都是用 DirectX 所開發,包括即將發行的新 型遊戲機 Xbox 也是使用 DirectX 來開發遊戲。

DirectX 是當紅的 2D、3D application 開發 SDK,特別是應用在 多媒體,graphics、games 上。目前許多的 pc game 甚至 arcade game 都是用 DirectX 所開發,將來還會更普及。DirectX 的前身 WinG,也 就是 Windows Game SDK,事實上根本是為遊戲製作而量身打造的,到 了 DirectX 之後,由於對硬體的支援更普遍,更密切, 已經不只是遊 戲專用的 SDK。

使用 DirectX 最大的好處是你可以很方便取得硬體性能資訊,將 硬體的性能發揮得淋漓盡致,包括 2D、3D、音效、搖桿、鍵盤等輸入 設備、網路等,這一點是其他的 3D SDK 如 Glide 和 OpenGL 所做不到 的。

在以前,光是要支援一個遊戲的音效,就是一件很麻煩的事,你 得考慮到 Ad Lib, SoundBlast,音源器,MIDI,VOC,後來的又出現 wave table,Windows wav 等格式和新產品,將來還會有更複雜的東西 出現,光是搞這些東西就會耗掉程式設計師許多時間,相對的,純粹 花在遊戲設計的時間就少了很多,效率就不好。

其實不只是音效,顯示卡的性能也越來越好,越來越複雜,不論 2D 或 3D 加速卡,如果你是一個有經驗的程式設計師或寫過顯示卡的驅 動程式,你就會了解到要寫一個可以適用於所有的系統的 game 是一件

非常不容易的事,如今可憐的程式設計師發現他們又要面對網路,特 別是 internet。

所以 DirectX 的最大好處不是在於 game 本身,而是對硬體的充分 支援,和其便利性。

DirectX 包含幾個部分:

DirectDraw: 最主要的功能是處理顯示記憶體和系統記憶體, 比 如你可以規劃系統記憶體來儲存影像,再將這些影像以硬體所支援的 功 能 輸 出 到 顯 示 記 憶 體 , 於 是 就 可 以 在 螢 幕 上 看 到 影 像 。 由 於 DirectDraw 可以偵測並且充分使用顯示卡的性能,因此可以將顯示速 度提昇到最佳的狀況,這一點是 win32 SDK 所做不到的,因為 Windows 是多工作業系統,基本上並不允許任何應用程式隨意存取系統或顯示 記憶體,所有的 window 影像都必須由作業系統來儲存和安排。

你可以使用 DirectDraw 設定你的程式是普通的 windows window 或 者 使 用 整 個 螢 幕 而 捨 棄 window , 成 為 一 個 full-screen application, 在這種狀況下你可以任意設定解析度。

除此之外,DirectDraw 還提供一些基本的 2d 功能,比方設定 color key,使圖形的背景顏色成為透明.這一點在 game 中應用很廣泛。

Clipper 則可以使我們的角色在 window 中自由運動,不必擔心會跑到 window 外,或是角色超出顯示記憶體的定址( addressing )範圍。其 他還有一些比較冷僻,對 game 沒有什麼用處,但是硬體還是支援的部 分,像是 overlay。

Direct3D Immediate Mode:使用 Direct3D IM 並不是一件愉快的 事,首先,你必須提供 3d model 轉換成 world, world 轉成 view, view 轉 成 投 影 平 面 的 三 組 矩 陣 , 然 後 你 還 得 設 定 light , render , texture,z-buffer 等等的 state, 換句話說,你必須先對線性代數 和 3d 電腦圖學下一番功夫,瞭若指掌,不然你不知道這些到底是什麼

東西,也無從使用 IM。若是依我之見,除非你要開發一些 Direct3D Retained Mode 所缺乏的功能,或是你要使用某種 RM 所不支援的 3d 檔,否則沒有必要使用 IM。但是要偵測 3D 加速卡,讓 3D 應用程式能 有最佳表現,還是要用到一小部分的 D3D IM。

Direct3D Retained Mode:架構在 IM 之上的一個介面。可以這樣 比喻,IM 好像是程式語言,RM 是由程式語言所寫的函式庫。RM 有豐富 的介面,拿來開發一套標準的 3D game 是綽綽有餘,起碼寫一個像古 墓奇兵( tomb raider)的 game 一定沒問題。透過 Direct3D RM 你可以 很簡單地載入 3D model, 使 model 運動,或是由 user 來控制,也可 以設定 model 的貼圖,材質,animation,功能相當的多,很多人以為 D3D RM 所寫出來的程式跑不快,事實不然,畢竟 D3D RM 就是由 D3D IM 所寫成的。

DirectPlay:用來開發網路遊戲的介面,幾乎所有較普遍的通訊 協定都支援,現在又有 Lobby 介面讓 user 可以在 internet 上很輕鬆 地和玩家或玩家之間彼此溝通,不必花費很多時間寫 client-sever 介 面程式.比如你可以透過這個介面來找對手,和對方連線來玩 game。

DirectSound:從字義上我們就了解這是一個處理音效的介面,它 可以偵測玩家系統上的音效卡,從而決定所要輸出的音效種類( midi,

voice )和音質。

DirectInput:處理輸入設備,包括搖桿,滑鼠和鍵盤等。

構件物件模型(COM)

大多數的 DirectX API 的物件及介面都是基於構件物件模型。構 件物件模型是建立在一個使用面向物件的系統之上的,這就是構件物 件模型程式的核心模式。這也是一個可以創建多個介面的介面。它是 一個作業系統級的物件模型。

許多 DirectX API 都是以構件物件模型爲標準而創建的。你可以 這樣理解:一個物件就象一個黑盒子記錄了硬體及應用程式通過一個 介面所進行的所需的通訊。命令送到或接收自一個通過構件物件模型 介面的物件,這就叫做巨集。例如:IDirectDraw4::GetDisplayMode 巨集是通過 IDirectDraw4 介面從 DirectDraw 物件來獲得當前顯示適 配器的顯示模式。

在運行時一個物件可以與另一個物件相互捆綁,也可以使用其他 物件所提供的介面。如果你知道物件是構件物件模型物件,並知道這 個物件所支援的介面,你的應用程式(或另一個物件) 便可決定第一物 件所能提供的服務。所有的構件物件模型的物件都能繼承一個巨集,

查詢介面巨集,能讓你決定物件提供的介面並爲這些介面創建指標。

IUnknown 介面

所有的構件物件模 型( 以下簡 稱 COM)介面都 是從一 個叫 IUnknown 的介面派生出來的。這個介面使 DirectX 能一直控制物件並 有能力操作更複雜的介面。 IUnknown 有以下三個方法:

1. AddRef,能使一個物件的關聯值在當一個介面或另一個應用程式將 自己連接到這個物件時加一。

當物件被創建,它的關聯值被設置爲 1。每次應用程式獲得物件的 介面或調用 AddRef 巨集時,這個物件的關聯值會增加一。可以使 用 Release 巨集來使物件的關聯值減一。

2. QueryInterface,獲得物件所支援的所需特殊介面指標的特性。它 決定物件是否支援一個特殊的 COM 介面。如果是,系統會增加物件 的關聯值,並且應用程式可立即使用這個介面。

3. Release,能使物件的關聯值減少一。當值爲零時,物件就被解除。

當關聯值爲零,物件將自行解除。使用 AddRef 宏使關聯值增加一.

這部分 IUnknown 巨集介面繼承於物件。

程 式 一 定 要 用 這 個 巨 集 來 釋 放 IUnknown::AddRef,

IUnknown::QueryInterface, 所 做 的 調 用 , 或 所 創 建 的 DirectDrawCreate。

AddRef 和 Release 巨集控制物件的關聯值。例如:如果你創建一 個 DirectDrawSurface 物件,則關聯值設置爲一,當每次一個過程對 於這個物件返回一個介面的指標時,該過程必須調用 AddRef 通過該指 標 來增加 關聯值 。你 必 須爲每個 AddRef 調用 設置一 個相 對 應的 Release。在該指標被銷毀前,你必須通過該指標來調用 Release。在 關聯值變爲 0 時,這個物件變被銷毀並且所有的介面都失效。

DirectX 的 COM 介面

DirectX 程式師手冊中的 COM 介面是建立在一個很基本的 COM 程式 階段。每個物件的介面都表示爲一個設備,就象 IDirectDraw4,

IDirectSound 及 IDirectPlay,都直接來自於 IUnknown COM 介面。

創建這些基本的物件是靠運用專門的動態銜接庫(DLL),除此之外還用 CoCreateInstance 功能來創建 COM 物件。

一般來說,DirectX 物件模式爲每個設備提供一個主物件。其他提 供服務的物件是從這個主物件派生出來的。例如: DirectDraw 物件就 是顯示適配器。你能使用它創建 DirectDrawSurface 物件來表示顯存 或 DirectDrawPalette 物件來表示硬體調色板。相同的 DirectSound 物件表示音效卡,所創建的 DirectSoundBuffer 物件表示卡上的音源。

除此之外,主設備物件能表示並決定硬體設備的性能,象螢幕尺 寸及發色數,及音效卡是否有波表合成器。

C++與 COM 介面

對 C++程式師,一個 COM 介面就象一個抽象類。就是,它定義設置 一個信號燈及語法但不啓用,並沒有實在的資料與介面。在一個 C++

抽象類,所有的巨集都定義爲抽象虛擬,也就是說他們並無實在的代 碼.

C++抽象虛擬函數及 COM 介面都使用一個叫做 VTABLE 的設備。一 個 VTABLE 包含一個介面所包含的所有函數的位址。如果你需要一個程 式或物件使用這些函數,你可以使用 QueryInterface 巨集來檢驗物件 上的介面並獲得該介面的指標。在使用 QueryInterface 後,程式或物 件事實上就是獲得物件 VTABLE 的指標,這個巨集可以調用物件所包含 的介面的巨集。這個機制使另一個或其他物件所使用的私人資料與子 進程的調用互不相干。

COM 物件與 C++物件的另一個相似之處是宏的第一爭用是介面或類 的命名,叫做 C++爭用。因爲 COM 物件和 C++物件在二進位上完全相容,

編譯 COM 介面與 C++抽象類採用的是相同的語法。降低了代碼複雜度。

例如:C++爭用就象一個已知的參數而不是編碼,並由 C++間接操作 VTABLE。

在文檔中 虛擬寵物與市場設計實作 (頁 8-14)

相關文件