Introduction To DirectPlay目錄: Creating and Managing Sessions DirectPlay Network Communication DirectPlay Transport Protocol Communicating with DirectPlay Objects DirectPlay Lobby Support 本文: Microsoft? DirectPlay? API為開發人員提供了開發諸如多人遊戲或聊天程式的工具。一個多人遊戲有兩個基本特性: 1 兩個或更多的獨立使用者,每個使用者都擁有用戶端遊戲程式 2 網路連接了使用者的電腦(通過中央電腦伺服器串連) DirectPlay提供了一個額外的層,使你的遊戲和網路底層相隔。並且,你的遊戲可以非常簡單的使用DirectPlay API,並使用DirectPlay管理網路通訊。DirectPlay提供的特性,使多人遊戲在開發中得到了很多簡化。其中包括: 1 建立和管理點對點,客戶/服務會話(Session) 2 在一個會話中系統管理使用者(User)和組(Group) 3 管理在不同網路平台上進行會話的成員之間發送的訊息 4 使遊戲在大廳(Lobby)中互動 5 使使用者可以進行語音互動 這部分的文檔(Introduction To DirectPlay)高度概括了DirectPlay的功能。隨後的章節將告訴你DirectPlay的細節和如何在你的遊戲中使用DirectPlay。 Creating and Managing Sessions 遊戲會話是一個特殊的多人遊戲。會話中會有兩個或者更多的使用者同時線上,使用者彼此擁有相同的遊戲用戶端。角色(Player)在遊戲中是一個實體,它被遊戲所定製。每個使用者可以擁有多個角色。不過,遊戲必須自己管理這些角色,使用DirectPlay介面對象來管理這些角色。 建立會話的第一步就是收集一組使用者的資訊。有兩種方式: 1 大多數遊戲會話都被一個運行在遠端電腦上大廳程式(lobby application)所管理。大多數基於Internet的遊戲都用這種方式。 2 各個使用者自己相互進行聯絡。這種方式一般用在小型的區域網路中。並且遊戲不是很大。 會話被管理後,遊戲就可以被串連。在會話過程中,角色可能從會話中退出,或者新的角色被加入。 在多人遊戲中,同一會話中的使用者UI應該進行同步。管理多人遊戲會話應該反覆發送訊息流程給每個使用者。比如,每當角色移動,一個訊息就應該被發送,以便在所有其他遊戲用戶端更新角色的位置。DirectPlay的核心就是為所有在一個會話中的電腦發送高效安全的訊息。 有兩種基本方式來組織會話訊息,一種是點對點,一種是客戶/服務模式。講這兩種模式的資料很多,這裡就不再複述。 DirectPlay Network Communication DirectPlay的主要功能是使遊戲和網路底層分開。如果你需要發送狀態更新的訊息,你可以很簡單的調用DirectPlay API,不必在意複雜的網路連接情況。DirectPlay網路服務提供了多種網路連接支援:TCP/IP, IPX, modem, 和 serial links。 DirectPlay Transport Protocol DirectPlay網路核心是DirectPlay協議。這個傳輸層協議在DirectPlay8中完全重寫,現在已經被用在所有的訊息中。DirectPlay協議重點放在讓你可以很簡單的發送訊息。協議為多人遊戲提供了很多量身定製的特性,包括: 1 可靠和不可靠的訊息傳遞。可靠傳遞的訊息是不斷的發送,直到目標程式確信接收了他們。你可以根據你的情況分配訊息的具體發送方法。 2 連續和非連續訊息傳遞。連續訊息被一個個傳送到目標程式中。 3 訊息分割和打包。當訊息的大小超過網路的許可,DirectPlay將自動進行分割和重組打包。 4 阻塞控制。DirectPlay會自動控制(throttles)你傳出訊息的速度,使目標程式能夠執行和接收訊息。 5 發送順序。要確保重要的訊息被首先發送,DirectPlay可以設定訊息的發送層級,其中包括low, medium, 和 high priority。High priority(最高優先發送)訊息被最先送上訊息佇列的前端,然後是medium和low。 6 訊息逾時處理。防止訊息佇列被阻塞,DirectPlay允許你指派每個訊息一個逾時值,當這個訊息逾時後,便從訊息佇列中移除。 DirectPlay Addresses 為了傳送訊息,每個加入多人遊戲的人都要有一個唯一的地址。運行遊戲用戶端的電腦提供裝置地址,而遊戲主機將提供主機地址。 DirectPlay的地址是一個URL字串。這些字串由如下格式構成: x-directplay:/[data string] 在不同的網路連接上,它包含發送訊息方和接收方這樣的元素。 DirectPlay地址對象會產生URL字串。依你的熟練程度,你可以直接使用URL地址或者通過DirectPlay地址對象來管理URL。(using the methods exposed by the address object to handle each element of the data string separately) Communicating with DirectPlay Objects DirectPlay其實是基於COM的。各個組件管理各個不同的方面。比如,DirectPlay點(peer)對象(CLSID_DirectPlay8Peer),就是負責管理點對點遊戲的。 你通過組件的介面來和它通訊。比如,在點對點遊戲中,你發送給另外使用者資料時,使用IDirectPlay8Peer::SendTo。DirectPlay會發送訊息到目標。 DirectPlay通過很多callback functions(回呼函數)進行聯絡。在原理上,這些函數和windows程式使用得回呼函數一樣。遊戲執行這些callback function,在DirectPlay初始化期間傳送函數指標。當DirectPlay需要通訊時,它調用callback function,並且傳遞兩個重要訊息: 1 評鑑訊息類別ID。 2 一個資料區塊指標,一般是一個結構體。 比如,當一個訊息發送上面的資訊到目標,目標程式的callback function將接收到DPNMSGID_RECEIVE訊息ID,指出那個訊息已經到達。並伴隨著包含資料的結構。 因為大多數的DirectPlay訊息是多線程的,其中關鍵就是callback function如何被恰當的執行。 DirectPlay Lobby Support 大廳(Lobby)主要的任務是安排角色會面和安排遊戲。大廳伺服器(Lobby servers)一般還有其他功能,比如主持聊天室,發送新聞和資訊,主持商業買賣。大廳伺服器可以便利的使用和安排多人遊戲工作,但它不是必需的。多人遊戲也可以直接在大廳用戶端之間進行通訊(lobby clients)。 一個具有大廳的多人遊戲,由三個部分組成: 1 大廳伺服器 2 大廳用戶端 3 支援大廳的遊戲(A lobbyable game) DirectPlay沒有具體的告訴大廳伺服器如何工作,你可以自己安排。DirectPlay提供了對大廳用戶端的支援。一個大廳用戶端通過大廳伺服器串連程式(vendor)進行工作,串連程式被安裝到使用者的系統上。它就像一個鏈,來串連使用者和大廳。當你要直接進行通訊,你必須知道每個大廳的工作細節。 大廳用戶端遊戲接收大廳伺服器的通訊細節,使用恰當的通訊協議。大廳用戶端進行使用者和遊戲程式之間的通訊。遊戲也能使用介面傳送訊息給大廳用戶端。 大廳實際可以串連任何程式。不過,遊戲必須有某些具體的大廳支援組件(lobby-aware components)。一般的,一個支援大廳的遊戲可以通過會話和大廳用戶端進行聯絡。如果遊戲被註冊成支援大廳,大廳用戶端能自動的接收更新資訊,並在遊戲裡進行相應的更新。諸如host migration。 |