複製鏈接
請複製以下鏈接發送給好友

DirectPlay

鎖定
Microsoft DirectPlay API為開發者提供了開發諸如多人遊戲或聊天程序的工具,它是Microsoft DirectX的組件之一。DirectPlay完成了與用户連接相關的所有複雜工作,使那些後台網絡地址轉化(NAT)設備保持一致,並管理會話。它允許你創建、查找、連接多人遊戲。連接以後,DirectPlay可以讓你向其他玩家發送已驗證或未驗證的信息。這是作為一個網絡應用程序最基本的框架,並且還提供了在遊戲中傳輸語音的功能。9.0新增內容,DirectPlay提供支持Microsoft Windows Powered Pocket PC 2002,並能與DirectPlay8.0的程序進行通訊。
外文名
Microsoft DirectPlay API
簡    稱
DirectPlay
使用人羣
開發者
性    質
多人遊戲或聊天程序的工具

DirectPlay基本介紹

Microsoft® DirectPlay® API提供給開發者開發例如遊戲或聊天客户端的多人應用程序的工具。簡單起見,本文件將把所有這樣的程序叫做“遊戲”。一個多人應用程序有兩個基本特徵:
兩個或多個單獨的用户,每一個都在它們的計算機上具有一個遊戲客户端
網絡聯接使得用户的計算機可以與其它人通信,或許通過一箇中央服務器。
DirectPlay提供了一個額外的層,使你的遊戲和網絡底層相隔。並且,你的遊戲可以非常簡單的使用DirectPlay API,並使用DirectPlay管理網絡通訊

DirectPlay特性

DirectPlayDirectPlay特性

DirectPlay提供的特性,使多人遊戲在開發中得到了很多簡化。其中包括:
1 創建和管理點對點,客户/服務會話(Session)
2 在一個會話中管理用户(User)和組(Group)
3 管理在不同網絡平台上進行會話的成員之間發送的消息
4 使遊戲在大廳(Lobby)中互動
5 使用户可以進行語音互動
這部分的文檔(Introduction To DirectPlay)高度概括了DirectPlay的功能。隨後的章節將告訴你DirectPlay的細節和如何在你的遊戲中使用DirectPlay。
DirectPlay Network Communication
Communicating with DirectPlay Objects
Creating and Managing Sessions

DirectPlayDirectPlay9.0新特性

DirectPlay應用程序接口(APIs)可以運行在Microsoft Windows® Powered Pocket PC 2002系統上。詳細內容請查看DirectPlay for Pocket PC 2002。
DPN_MSGID_SEND_COMPLETE消息結構允許你利用其內部的兩個成員在短時間內進行消息往返性質的傳輸。
DirectPlay提供一個新的網絡服務層,你可以使用IDP8SimControl的方法去調試一個多樣性的網絡環境(PS:我認為這裏是説在一個應用程序中同時使用多個協議) 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有一個新的接口,IDirectPlay8ThreadPool,它允許你管理應用程序中的多個線程。
應用程序可以取消所有消息發送,前提是一個特殊的玩家在調用以下幾個函數中使用了DPNCANCEL_PLAYER_SENDS標誌位
IDirectPlay8Peer::CancelAsyncOperation, IDirectPlay8Server::CancelAsyncOperation, IDirectPlay8Client::CancelAsyncOperation.
玩家們可以在DPN_MSGID_CONNECT_COMPLETE消息中接收他們的本地玩家標識符(ID).
主機可以預防從進程枚舉中提取到被設置為DPNSESSION_NOENUMS 標誌位的DPN_APPLICATION_DESC結構。該消息在調用IDirectPlay8Peer::Host and IDirectPlay8Server::Host時發出.
如果消息發送到一個沒有任務玩家的組中,它將馬上返回DPNSUCCESS_NOPLAYERSINGROUP以替代了原來的DPNERR_GENERIC.
信息包的簽名可用在所有DirectPlay通信上。
在調用以下幾個方法時,將標誌位設置為DPNCLOSE_IMMEDIATE,那麼該應用程序可以被立即關閉。
IDirectPlay8Peer::Close,
IDirectPlay8Client::Close,
IDirectPlay8Server::Close.
DirectPlay 9.0 增強了反向連接欺騙的防禦措施
在以下方法中使用DPNINITIALIZE_HINT_LANSESSION 標誌位初始化 IDirectPlay8Peer::Initialize,
IDirectPlay8Client::Initialize,
IDirectPlay8Server::Initialize.
在調用發送信息的函數時,信息包是可以被連接合並的。只要在以下函數中設置DPNSEND_COALESCE標誌位
IDirectPlay8Peer::SendTo,
IDirectPlay8Client::Send,
IDirectPlay8Server::SendTo.
應用程序可以利用DPN_CAPS_EX結構對DirectPlay的協議進行調整。適用函數:IDirectPlay8Peer::GetCaps,IDirectPlay8Client::GetCaps,
IDirectPlay8Server::GetCaps,IDirectPlay8Peer::SetCaps,
IDirectPlay8Client::SetCaps,IDirectPlay8Server::SetCaps.
當一個組被加入到DPNMSG_CREATE_GROUP結構中,就會擁有上下關聯的值。
如果在調用IDirectPlay8Peer::Host或者 IDirectPlay8Server::Host方法時,沒有在DPN_APPLICATION_DESC結構中設置DPNSESSION_NODPNSVR標誌位,並且沒有運行dpnsvr.exe,那麼創建主機的行為將會出錯並返回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.

DirectPlay網絡通訊

DirectPlayDirectPlay點對點佈局

一個點對點遊戲由單獨的玩家計算機組成,用網絡連接進行連接。示意,一個四玩家點對點遊戲佈局看起來是這樣:
Gameplay通過具有每一用户的遊戲客户端與其它用户客户端直接通信進行控制。例如,當一個用户移動,這一遊戲客户端必須發送三條更新消息,每一條發送到每一個其它用户計算機。
一個點對點遊戲通常被組織和加載於一個用户計算機上的大廳客户端程序。大頂客户端能夠組織一個會話有兩個基本方法:
大廳客户端與其它潛在用户的大廳客户端直接進行通信。這一方案能被用於,例如,組織一個用户在同一局域網子網中的遊戲。
大廳客户工作於一個遠程計算機上的大廳服務器程序的聯接。這是基於互聯網遊戲通常的組織方法。
一旦一個會話被設置好和啓動,大部分或所有消息將是用户到用户的。如果一個大廳服務器被關聯,它將僅僅控制這樣的工作,比如當一個玩家離開遊戲時更新會話成員列表,或者允許新的用户進入會話的請求。否則,服務器居於後台,並且特定情況下甚至不知道大部分正發出的消息。
因為服務器端或者是不存在的或者至少不直接與遊戲進行有關,一個用户被設計為遊戲主機。它們負責管理後勤的細節,如把新玩家帶入正在進行的會話。
點對點遊戲具有簡單的優點。所有所需是一個招集玩家的遊戲客户端,通過管理一個會話。點對點佈局的主要缺點是數量性。隨着用户數量增加,消息數量需要幾何級的增長。用户數的最大值依賴於遊戲和網絡帶寬,但是特定為不超過20-30。

DirectPlayDirectPlay網絡通訊

協議提供了極其適用多用户遊戲的大量特徵:
·可靠及不可靠的消息傳遞。可靠消息將一直重發直到對方接收;
·連續及不連續的消息分發。連續消息會以發送時的順序達到目的端;
·消息分塊及重組。如果消息大小超過了網絡傳輸能力,DirectPlay會自動把這些消息分塊(傳輸)並重組;
·擁塞控制。DirectPlay可以自動“扼殺”Outgoing的消息以使得目標(程序)可以(及時)處理。
(以上兩條,其實就是解決兩個問題,消息的大小,及單位時間內可以發送消息的個數)
·發送優先級,以確保重要消息先發送。DirectPlay可以制定三種級別低(low)、中(medium)、高(high)。high優先級的消息在輸出隊列的前端,然後依次是medium及low優先級的消息。
DirectPlay網絡能力的核心是DirectPlay協議。這一傳輸層協議完全兼容DirectPlay8,現在並且用於所有消息。DirectPlay協議關注於全你從發送程序到接收程序傳送數據更簡單,不需為兩者間發生了什麼犯愁。這一協議提供了一定數量的特性,以供應多人遊戲的需求,包括:
消息的可靠和不可靠傳輸。可靠消息將被重新傳輸直到接收程序收到它們。你可以分配傳輸類型為message-by-message。
消息的連續和不連續傳輸。連續消息將以它們發出時的順序傳送的接收程序。
消息的分裂與組裝。如果消息尺寸超過特定網絡的能力,DirectPlay自動分裂組裝消息。
阻塞控制。DirectPlay自動扼殺你發出的消息到一個接收程序可以控制的極別。這一特性防止你因大最接收程序不能處理的消息所造成的消息氾濫。
傳輸優先級。為了保證最重要的消息首先被髮出。DirectPlay允許你指定消息為低、中、高優先級。高優先級的消息被髮送到輸出隊列的最前面,其後是中、低優先級消息。
消息超時設定。為了防止送出的消息隊列被很多當前的消息延時的消息阻塞,DirectPlay允許你為所有消息設定一個超時值。當一個消息超時時,它被從發出消息隊列(outgoing message queue)刪除,不管它發沒發出。

DirectPlayDirectPlay 地址

為了能傳遞消息,多人遊戲中,每個參與者都必須擁有一個唯一(可識別的)地址。
地址可能會參照應用程序所在機器(設備地址)或者應用程序需要通信的機器(主機地址)而確定。
DirectPlay地址的形式同URL串,由scheme、scheme分隔符及數據串組成:
為了傳輸消息,每一個多人遊戲中的參與者必須具有一個唯一的地址。地址能涉及你的應用程序運行於其上的計算機(設備地址device address)或都你的應用程序需要通信的計算機(主機地址host address)兩者。
DirectPlay地址是URL字符串格式。這些字符串由一個scheme(方案)、scheme separator(方案分離器)和數據字符串組成,具有下面通用的格式。
x-directplay:/[data string]
數據字符串包括不同的元素,以指定使發送者和接收者兩者間能夠發生通信所需要的任何東西,覆蓋多種不同的網絡連接類型。
在使用方面,URL字符串被傳遞到DirectPlay API方法或從DirectPlay API方法傳遞的DirectPlay地址對象所包含。你具有直接操作URL字符串或使用由地址對象暴露的方法以操作數據字符串分離出的每一個元素的選項。

DirectPlay與DirectPlay對象通信

簡介
DirectPlay包括一個COM對象集。每個對象暴露了一個或多個使你能控制DirectPlay不同方面的一個或多個接口。比如,DirectPlay點(peer)對象(CLSID_DirectPlay8Peer),就是負責管理點對點遊戲的。
你通過調用DirectPlay對象接口所暴露的方法來和它通訊。比如,為了在點對點遊戲給其它用户發送數據,你將調用IDirectPlay8Peer::SendTo方法發送一條消息。DirectPlay然後會在它的接收端處理接收消息的工作。
DirectPlay通過一個或多個callback functions(回調函數)與你的應用程序進行通信這些函數和windows程序使用的回調函數相似。你的應用程序初始化期間執行這些callback function並傳遞一個這個函數的指針。當DirectPlay需要與你的程序通訊時,它調用callback function,並且傳遞兩個重要信息:
1 一個表明消息類別的消息標識(ID)。
2 一個數據塊指針,代表一個結構體,提供任何需要的細節。
示例
例如:
HRESULT WINAPI DirectPlayMessageHandler( PVOID pvUserContext, DWORD dwMessageId,PVOID pMsgBuffer)
{return S_OK;}
比如,當一個發送上面的信息的消息到目標,目標程序的callback function將接收到一條具有DPNMSGID_RECEIVE消息ID的消息,指示一條消息已經被其它用户收到。相伴的結構體包括了數據。
因為大多數的DirectPlay消息是多線程的,其中關鍵就是callback function如何被恰當的執行。

DirectPlayDirectPlay創建和管理會話

一個遊戲會話是一個特定的多人遊戲的實例。一個會話具有兩個或多個用户同時遊戲,每個在他或她的計算機上具有同樣的遊戲客户端。一個玩家(player)是一個在遊戲中自身的實體,並被特定遊戲所定義。一個用户可能在一個遊戲中具有不只一個的玩家角色。然而,遊戲應用程序必須自己管理這些玩家,用對於每一個玩家單獨的DirectPlay接口或對象。
創建會話的第一步就是集中一組用户。有兩種方式:
1 大多數遊戲會話都被一個運行在遠程計算機上大廳程序(lobby application)所管理。這種方式被用於大多數基於Internet的遊戲。
2、也可以通過單獨的用户計算機與其它人的進行通信來管理遊戲。這一方式被限定於一組所有潛在用户都在同一個局域網中的情況下。
一旦會話被建立,遊戲就被啓動並且遊戲玩家開始遊戲。遊戲進行中,玩家可能離開會話或者新的玩家加入。細節取決於特定的遊戲。
在多人遊戲中,每一用户的用户界面(user interface (UI))能被會話中的所有其它用户所同步。管理多玩家會話因而需要一個連續的從其它用户發出或到達其它用户的消息流。例如,每次一個玩家移動,一條消息必須被髮送以在這一會話中的所有其它遊戲客户端更新這一玩家的位置。DirectPlay的核心就是這一部分的API支持在所有在一個會話中的所有計算機間高效靈活的消息機制。
有兩種基本的一個會話消息機制佈局(topology)的結構的方法:一種是點對點,一種是客户/服務模式(peer-to-peer and client/server)。兩種佈局都有它們的優點和限制,因而你將需要評估哪一種更適合你的遊戲。