必威电竞|足球世界杯竞猜平台

DirectPlay
來源:互聯(lián)網(wǎng)

微軟 DirectPlay API為開發(fā)者提供了開發(fā)諸如多人游戲或聊天程序的工具,它是Microsoft DirectX的組件之一。DirectPlay完成了與用戶連接相關(guān)的所有復(fù)雜工作,使那些后臺(tái)網(wǎng)絡(luò)地址轉(zhuǎn)化(NAT)設(shè)備保持一致,并管理會(huì)話。它允許你創(chuàng)建、查找、連接多人游戲。連接以后,DirectPlay可以讓你向其他玩家發(fā)送已驗(yàn)證或未驗(yàn)證的信息。這是作為一個(gè)網(wǎng)絡(luò)應(yīng)用程序最基本的框架,并且還提供了在游戲中傳輸語音的功能。9.0新增內(nèi)容,DirectPlay提供支持Microsoft Windows Powered Pocket PC 2002,并能與DirectPlay8.0的程序進(jìn)行通訊。

介紹

微軟? DirectPlay? API提供給開發(fā)者開發(fā)例如游戲或聊天客戶端的多人應(yīng)用程序的工具。簡(jiǎn)單起見,本文件將把所有這樣的程序叫做“游戲”。一個(gè)多人應(yīng)用程序有兩個(gè)基本特征:

兩個(gè)或多個(gè)單獨(dú)的用戶,每一個(gè)都在它們的計(jì)算機(jī)上具有一個(gè)游戲客戶端。

網(wǎng)絡(luò)聯(lián)接使得用戶的計(jì)算機(jī)可以與其它人通信,或許通過一個(gè)中央服務(wù)器。

DirectPlay提供了一個(gè)額外的層,使你的游戲和網(wǎng)絡(luò)底層相隔。并且,你的游戲可以非常簡(jiǎn)單的使用DirectPlay API,并使用DirectPlay管理網(wǎng)絡(luò)通訊。

特性

DirectPlay特性

DirectPlay提供的特性,使多人游戲在開發(fā)中得到了很多簡(jiǎn)化。其中包括:

1 創(chuàng)建和管理點(diǎn)對(duì)點(diǎn),客戶/服務(wù)會(huì)話(Session)

2 在一個(gè)會(huì)話中管理用戶(User)和組(Group)

3 管理在不同網(wǎng)絡(luò)平臺(tái)上進(jìn)行會(huì)話的成員之間發(fā)送的消息

4 使游戲在大廳(Lobby)中互動(dòng)

5 使用戶可以進(jìn)行語音互動(dòng)

這部分的文檔(Introduction To DirectPlay)高度概括了DirectPlay的功能。隨后的章節(jié)將告訴你DirectPlay的細(xì)節(jié)和如何在你的游戲中使用DirectPlay。

DirectPlay Network Communication

Communicating with DirectPlay Objects

Creating and Managing Sessions

DirectPlay9.0新特性

DirectPlay應(yīng)用程序接口(APIs)可以運(yùn)行在Microsoft Windows? Powered Pocket PC 2002系統(tǒng)上。詳細(xì)內(nèi)容請(qǐng)查看DirectPlay for Pocket PC 2002。

DPN_MSGID_SEND_COMPLETE消息結(jié)構(gòu)允許你利用其內(nèi)部的兩個(gè)成員在短時(shí)間內(nèi)進(jìn)行消息往返性質(zhì)的傳輸。

DirectPlay提供一個(gè)新的網(wǎng)絡(luò)服務(wù)層,你可以使用IDP8SimControl的方法去調(diào)試一個(gè)多樣性的網(wǎng)絡(luò)環(huán)境(PS:我認(rèn)為這里是說在一個(gè)應(yīng)用程序中同時(shí)使用多個(gè)協(xié)議) DirectPlay has a new service provider for network simulation. You can use the IDP8SimControl methods to test applications under a variety of network conditions.

DirectPlay有一個(gè)新的接口,IDirectPlay8ThreadPool,它允許你管理應(yīng)用程序中的多個(gè)線程。

應(yīng)用程序可以取消所有消息發(fā)送,前提是一個(gè)特殊的玩家在調(diào)用以下幾個(gè)函數(shù)中使用了DPNCANCEL_PLAYER_SENDS標(biāo)志位

IDirectPlay8Peer::CancelAsyncOperation, IDirectPlay8Server::CancelAsyncOperation, IDirectPlay8Client::CancelAsyncOperation.

玩家們可以在DPN_MSGID_CONNECT_COMPLETE消息中接收他們的本地玩家標(biāo)識(shí)符(ID).

主機(jī)可以預(yù)防從進(jìn)程枚舉中提取到被設(shè)置為DPNSESSION_NOENUMS 標(biāo)志位的DPN_APPLICATION_DESC結(jié)構(gòu)。該消息在調(diào)用IDirectPlay8Peer::Host and IDirectPlay8Server::Host時(shí)發(fā)出.

如果消息發(fā)送到一個(gè)沒有任務(wù)玩家的組中,它將馬上返回DPNSUCCESS_NOPLAYERSINGROUP以替代了原來的DPNERR_GENERIC.

信息包的簽名可用在所有DirectPlay通信上。

在調(diào)用以下幾個(gè)方法時(shí),將標(biāo)志位設(shè)置為DPNCLOSE_IMMEDIATE,那么該應(yīng)用程序可以被立即關(guān)閉。

IDirectPlay8Peer::Close,

IDirectPlay8Client::Close,

IDirectPlay8Server::Close.

DirectPlay 9.0 增強(qiáng)了反向連接欺騙的防御措施

在以下方法中使用DPNINITIALIZE_HINT_LANSESSION 標(biāo)志位初始化 IDirectPlay8Peer::Initialize,

IDirectPlay8Client::Initialize,

IDirectPlay8Server::Initialize.

在調(diào)用發(fā)送信息的函數(shù)時(shí),信息包是可以被連接合并的。只要在以下函數(shù)中設(shè)置DPNSEND_COALESCE標(biāo)志位

IDirectPlay8Peer::SendTo,

IDirectPlay8Client::Send,

IDirectPlay8Server::SendTo.

應(yīng)用程序可以利用DPN_CAPS_EX結(jié)構(gòu)對(duì)DirectPlay的協(xié)議進(jìn)行調(diào)整。適用函數(shù):IDirectPlay8Peer::GetCaps,IDirectPlay8Client::GetCaps,

IDirectPlay8Server::GetCaps,IDirectPlay8Peer::SetCaps,

IDirectPlay8Client::SetCaps,IDirectPlay8Server::SetCaps.

當(dāng)一個(gè)組被加入到DPNMSG_CREATE_GROUP結(jié)構(gòu)中,就會(huì)擁有上下關(guān)聯(lián)的值。

如果在調(diào)用IDirectPlay8Peer::Host或者 IDirectPlay8Server::Host方法時(shí),沒有在DPN_APPLICATION_DESC結(jié)構(gòu)中設(shè)置DPNSESSION_NODPNSVR標(biāo)志位,并且沒有運(yùn)行dpnsvr.exe,那么創(chuàng)建主機(jī)的行為將會(huì)出錯(cuò)并返回DPNERR_DPNSVRNOTAVAILABLE.

Less reliable connections should now perform better with improved DirectPlay protocol behavior.

Network Address Translation (NAT) support has improved. This includes the new IDirectPlay8NATResolver interface, which allows you to create a NAT resolver application.

DirectPlay now supports Internet Protocol (IP) v6.

網(wǎng)絡(luò)通訊

DirectPlay點(diǎn)對(duì)點(diǎn)布局

一個(gè)點(diǎn)對(duì)點(diǎn)游戲由單獨(dú)的玩家計(jì)算機(jī)組成,用網(wǎng)絡(luò)連接進(jìn)行連接。示意,一個(gè)四玩家點(diǎn)對(duì)點(diǎn)游戲布局看起來是這樣:

Gameplay通過具有每一用戶的游戲客戶端與其它用戶客戶端直接通信進(jìn)行控制。例如,當(dāng)一個(gè)用戶移動(dòng),這一游戲客戶端必須發(fā)送三條更新消息,每一條發(fā)送到每一個(gè)其它用戶計(jì)算機(jī)

一個(gè)點(diǎn)對(duì)點(diǎn)游戲通常被組織和加載于一個(gè)用戶計(jì)算機(jī)上的大廳客戶端程序。大頂客戶端能夠組織一個(gè)會(huì)話有兩個(gè)基本方法:

大廳客戶端與其它潛在用戶的大廳客戶端直接進(jìn)行通信。這一方案能被用于,例如,組織一個(gè)用戶在同一局域網(wǎng)子網(wǎng)中的游戲。

大廳客戶工作于一個(gè)遠(yuǎn)程計(jì)算機(jī)上的大廳服務(wù)器程序的聯(lián)接。這是基于互聯(lián)網(wǎng)游戲通常的組織方法。

一旦一個(gè)會(huì)話被設(shè)置好和啟動(dòng),大部分或所有消息將是用戶到用戶的。如果一個(gè)大廳服務(wù)器被關(guān)聯(lián),它將僅僅控制這樣的工作,比如當(dāng)一個(gè)玩家離開游戲時(shí)更新會(huì)話成員列表,或者允許新的用戶進(jìn)入會(huì)話的請(qǐng)求。否則,服務(wù)器居于后臺(tái),并且特定情況下甚至不知道大部分正發(fā)出的消息。

因?yàn)榉?wù)器端或者是不存在的或者至少不直接與游戲進(jìn)行有關(guān),一個(gè)用戶被設(shè)計(jì)為游戲主機(jī)。它們負(fù)責(zé)管理后勤的細(xì)節(jié),如把新玩家?guī)胝谶M(jìn)行的會(huì)話。

點(diǎn)對(duì)點(diǎn)游戲具有簡(jiǎn)單的優(yōu)點(diǎn)。所有所需是一個(gè)招集玩家的游戲客戶端,通過管理一個(gè)會(huì)話。點(diǎn)對(duì)點(diǎn)布局的主要缺點(diǎn)是數(shù)量性。隨著用戶數(shù)量增加,消息數(shù)量需要幾何級(jí)的增長(zhǎng)。用戶數(shù)的最大值依賴于游戲和網(wǎng)絡(luò)帶寬,但是特定為不超過20-30。

DirectPlay網(wǎng)絡(luò)通訊

協(xié)議提供了極其適用多用戶游戲的大量特征:

·可靠及不可靠的消息傳遞。可靠消息將一直重發(fā)直到對(duì)方接收;

·連續(xù)及不連續(xù)的消息分發(fā)。連續(xù)消息會(huì)以發(fā)送時(shí)的順序達(dá)到目的端;

·消息分塊及重組。如果消息大小超過了網(wǎng)絡(luò)傳輸能力,DirectPlay會(huì)自動(dòng)把這些消息分塊(傳輸)并重組;

·擁塞控制。DirectPlay可以自動(dòng)“扼殺”O(jiān)utgoing的消息以使得目標(biāo)(程序)可以(及時(shí))處理。

(以上兩條,其實(shí)就是解決兩個(gè)問題,消息的大小,及單位時(shí)間內(nèi)可以發(fā)送消息的個(gè)數(shù))

·發(fā)送優(yōu)先級(jí),以確保重要消息先發(fā)送。DirectPlay可以制定三種級(jí)別低(low)、中(medium)、高(high)。high優(yōu)先級(jí)的消息在輸出隊(duì)列的前端,然后依次是medium及l(fā)ow優(yōu)先級(jí)的消息。

DirectPlay網(wǎng)絡(luò)能力的核心是DirectPlay協(xié)議。這一傳輸層協(xié)議完全兼容DirectPlay8,現(xiàn)在并且用于所有消息。DirectPlay協(xié)議關(guān)注于全你從發(fā)送程序到接收程序傳送數(shù)據(jù)更簡(jiǎn)單,不需為兩者間發(fā)生了什么犯愁。這一協(xié)議提供了一定數(shù)量的特性,以供應(yīng)多人游戲的需求,包括:

消息的可靠和不可靠傳輸。可靠消息將被重新傳輸直到接收程序收到它們。你可以分配傳輸類型為message-by-message。

消息的連續(xù)和不連續(xù)傳輸。連續(xù)消息將以它們發(fā)出時(shí)的順序傳送的接收程序。

消息的分裂與組裝。如果消息尺寸超過特定網(wǎng)絡(luò)的能力,DirectPlay自動(dòng)分裂組裝消息。

阻塞控制。DirectPlay自動(dòng)扼殺你發(fā)出的消息到一個(gè)接收程序可以控制的極別。這一特性防止你因大最接收程序不能處理的消息所造成的消息泛濫。

傳輸優(yōu)先級(jí)。為了保證最重要的消息首先被發(fā)出。DirectPlay允許你指定消息為低、中、高優(yōu)先級(jí)。高優(yōu)先級(jí)的消息被發(fā)送到輸出隊(duì)列的最前面,其后是中、低優(yōu)先級(jí)消息。

消息超時(shí)設(shè)定。為了防止送出的消息隊(duì)列被很多當(dāng)前的消息延時(shí)的消息阻塞,DirectPlay允許你為所有消息設(shè)定一個(gè)超時(shí)值。當(dāng)一個(gè)消息超時(shí)時(shí),它被從發(fā)出消息隊(duì)列(outgoing message queue)刪除,不管它發(fā)沒發(fā)出。

DirectPlay 地址

為了能傳遞消息,多人游戲中,每個(gè)參與者都必須擁有一個(gè)唯一(可識(shí)別的)地址。

地址可能會(huì)參照應(yīng)用程序所在機(jī)器(設(shè)備地址)或者應(yīng)用程序需要通信的機(jī)器(主機(jī)地址)而確定。

DirectPlay地址的形式同URL串,由Scheme、scheme分隔符及數(shù)據(jù)串組成:

為了傳輸消息,每一個(gè)多人游戲中的參與者必須具有一個(gè)唯一的地址。地址能涉及你的應(yīng)用程序運(yùn)行于其上的計(jì)算機(jī)(設(shè)備地址device address)或都你的應(yīng)用程序需要通信的計(jì)算機(jī)(主機(jī)地址host address)兩者。

DirectPlay地址是URL字符串格式。這些字符串由一個(gè)scheme(方案)、scheme separator(方案分離器)和數(shù)據(jù)字符串組成,具有下面通用的格式。

x-directplay:/[data string]

數(shù)據(jù)字符串包括不同的元素,以指定使發(fā)送者和接收者兩者間能夠發(fā)生通信所需要的任何東西,覆蓋多種不同的網(wǎng)絡(luò)連接類型。

在使用方面,URL字符串被傳遞到DirectPlay API方法或從DirectPlay API方法傳遞的DirectPlay地址對(duì)象所包含。你具有直接操作URL字符串或使用由地址對(duì)象暴露的方法以操作數(shù)據(jù)字符串分離出的每一個(gè)元素的選項(xiàng)。

與DirectPlay對(duì)象通信

簡(jiǎn)介

DirectPlay包括一個(gè)COM對(duì)象集。每個(gè)對(duì)象暴露了一個(gè)或多個(gè)使你能控制DirectPlay不同方面的一個(gè)或多個(gè)接口。比如,DirectPlay點(diǎn)(peer)對(duì)象(CLSID_DirectPlay8Peer),就是負(fù)責(zé)管理點(diǎn)對(duì)點(diǎn)游戲的。

你通過調(diào)用DirectPlay對(duì)象接口所暴露的方法來和它通訊。比如,為了在點(diǎn)對(duì)點(diǎn)游戲給其它用戶發(fā)送數(shù)據(jù),你將調(diào)用IDirectPlay8Peer::SendTo方法發(fā)送一條消息。DirectPlay然后會(huì)在它的接收端處理接收消息的工作。

DirectPlay通過一個(gè)或多個(gè)callback functions(回調(diào)函數(shù))與你的應(yīng)用程序進(jìn)行通信這些函數(shù)和windows程序使用的回調(diào)函數(shù)相似。你的應(yīng)用程序初始化期間執(zhí)行這些callback 函數(shù)并傳遞一個(gè)這個(gè)函數(shù)的指針。當(dāng)DirectPlay需要與你的程序通訊時(shí),它調(diào)用callback function,并且傳遞兩個(gè)重要信息:

1 一個(gè)表明消息類別的消息標(biāo)識(shí)(ID)。

2 一個(gè)數(shù)據(jù)塊指針,代表一個(gè)結(jié)構(gòu)體,提供任何需要的細(xì)節(jié)。

示例

例如:

HRESULT WINAPI DirectPlayMessageHandler( PVOID pvUserContext, DWORD dwMessageId,

PVOID pMsgBuffer)

{return S_OK;}

比如,當(dāng)一個(gè)發(fā)送上面的信息的消息到目標(biāo),目標(biāo)程序的callback function將接收到一條具有DPNMSGID_RECEIVE消息ID的消息,指示一條消息已經(jīng)被其它用戶收到。相伴的結(jié)構(gòu)體包括了數(shù)據(jù)。

因?yàn)榇蠖鄶?shù)的DirectPlay消息是多線程的,其中關(guān)鍵就是callback 函數(shù)如何被恰當(dāng)?shù)膱?zhí)行。

DirectPlay創(chuàng)建和管理會(huì)話

一個(gè)游戲會(huì)話是一個(gè)特定的多人游戲的實(shí)例。一個(gè)會(huì)話具有兩個(gè)或多個(gè)用戶同時(shí)游戲,每個(gè)在他或她的計(jì)算機(jī)上具有同樣的游戲客戶端。一個(gè)玩家(player)是一個(gè)在游戲中自身的實(shí)體,并被特定游戲所定義。一個(gè)用戶可能在一個(gè)游戲中具有不只一個(gè)的玩家角色。然而,游戲應(yīng)用程序必須自己管理這些玩家,用對(duì)于每一個(gè)玩家單獨(dú)的DirectPlay接口或?qū)ο蟆?/p>

創(chuàng)建會(huì)話的第一步就是集中一組用戶。有兩種方式:

1 大多數(shù)游戲會(huì)話都被一個(gè)運(yùn)行在遠(yuǎn)程計(jì)算機(jī)上大廳程序(lobby application)所管理。這種方式被用于大多數(shù)基于Internet的游戲。

2、也可以通過單獨(dú)的用戶計(jì)算機(jī)與其它人的進(jìn)行通信來管理游戲。這一方式被限定于一組所有潛在用戶都在同一個(gè)局域網(wǎng)中的情況下。

一旦會(huì)話被建立,游戲就被啟動(dòng)并且游戲玩家開始游戲。游戲進(jìn)行中,玩家可能離開會(huì)話或者新的玩家加入。細(xì)節(jié)取決于特定的游戲。

在多人游戲中,每一用戶的用戶界面(user interface (UI))能被會(huì)話中的所有其它用戶所同步。管理多玩家會(huì)話因而需要一個(gè)連續(xù)的從其它用戶發(fā)出或到達(dá)其它用戶的消息流。例如,每次一個(gè)玩家移動(dòng),一條消息必須被發(fā)送以在這一會(huì)話中的所有其它游戲客戶端更新這一玩家的位置。DirectPlay的核心就是這一部分的API支持在所有在一個(gè)會(huì)話中的所有計(jì)算機(jī)間高效靈活的消息機(jī)制。

有兩種基本的一個(gè)會(huì)話消息機(jī)制布局(topology)的結(jié)構(gòu)的方法:一種是點(diǎn)對(duì)點(diǎn),一種是客戶/服務(wù)模式(peer-to-peer and client/server)。兩種布局都有它們的優(yōu)點(diǎn)和限制,因而你將需要評(píng)估哪一種更適合你的游戲。

參考資料 >

生活家百科家居網(wǎng)