种豆资源网

当前位置:首页 > 百科 > 百科综合 / 正文

DirectPlay

(2020-01-08 13:24:32) 百科综合

DirectPlay

Microsoft DirectPlay API为开发者提供了开发诸如多人游戏或聊天程式的工具,它是Microsoft DirectX的组件之一。DirectPlay完成了与用户连线相关的所有複杂工作,使那些后台网路地址转化(NAT)设备保持一致,并管理会话。它允许你创建、查找、连线多人游戏。连线以后,DirectPlay可以让你向其他玩家传送已验证或未验证的信息。这是作为一个网路应用程式最基本的框架,并且还提供了在游戏中传输语音的功能。9.0新增内容,DirectPlay提供支持Microsoft Windows Powered Pocket PC 2002,并能与DirectPlay8.0的程式进行通讯。

基本介绍

  • 外文名:Microsoft DirectPlay API
  • 简称:DirectPlay
  • 使用人群:开发者
  • 性质:多人游戏或聊天程式的工具

介绍

Microsoft® DirectPlay® API提供给开发者开发例如游戏或聊天客户端的多人应用程式的工具。简单起见,本档案将把所有这样的程式叫做“游戏”。一个多人应用程式有两个基本特徵:
两个或多个单独的用户,每一个都在它们的计算机上具有一个游戏客户端。
网路联接使得用户的计算机可以与其它人通信,或许通过一个中央伺服器。
DirectPlay提供了一个额外的层,使你的游戏和网路底层相隔。并且,你的游戏可以非常简单的使用DirectPlay API,并使用DirectPlay管理网路通讯。

特性

DirectPlay特性

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

DirectPlay9.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点对点布局

一个点对点游戏由单独的玩家计算机组成,用网路连线进行连线。示意,一个四玩家点对点游戏布局看起来是这样:
Gameplay通过具有每一用户的游戏客户端与其它用户客户端直接通信进行控制。例如,当一个用户移动,这一游戏客户端必须传送三条更新讯息,每一条传送到每一个其它用户计算机。
一个点对点游戏通常被组织和载入于一个用户计算机上的大厅客户端程式。大顶客户端能够组织一个会话有两个基本方法:
大厅客户端与其它潜在用户的大厅客户端直接进行通信。这一方案能被用于,例如,组织一个用户在同一区域网路子网中的游戏。
大厅客户工作于一个远程计算机上的大厅伺服器程式的联接。这是基于网际网路游戏通常的组织方法。
一旦一个会话被设定好和启动,大部分或所有讯息将是用户到用户的。如果一个大厅伺服器被关联,它将仅仅控制这样的工作,比如当一个玩家离开游戏时更新会话成员列表,或者允许新的用户进入会话的请求。否则,伺服器居于后台,并且特定情况下甚至不知道大部分正发出的讯息。
因为伺服器端或者是不存在的或者至少不直接与游戏进行有关,一个用户被设计为游戏主机。它们负责管理后勤的细节,如把新玩家带入正在进行的会话。
点对点游戏具有简单的优点。所有所需是一个招集玩家的游戏客户端,通过管理一个会话。点对点布局的主要缺点是数量性。随着用户数量增加,讯息数量需要几何级的增长。用户数的最大值依赖于游戏和网路频宽,但是特定为不超过20-30。

DirectPlay网路通讯

协定提供了极其适用多用户游戏的大量特徵:
·可靠及不可靠的讯息传递。可靠讯息将一直重发直到对方接收;
·连续及不连续的讯息分发。连续讯息会以传送时的顺序达到目的端;
·讯息分块及重组。如果讯息大小超过了网路传输能力,DirectPlay会自动把这些讯息分块(传输)并重组;
·拥塞控制。DirectPlay可以自动“扼杀”Outgoing的讯息以使得目标(程式)可以(及时)处理。
(以上两条,其实就是解决两个问题,讯息的大小,及单位时间内可以传送讯息的个数)
·传送优先权,以确保重要讯息先传送。DirectPlay可以制定三种级别低(low)、中(medium)、高(high)。high优先权的讯息在输出伫列的前端,然后依次是medium及low优先权的讯息。
DirectPlay网路能力的核心是DirectPlay协定。这一传输层协定完全兼容DirectPlay8,现在并且用于所有讯息。DirectPlay协定关注于全你从传送程式到接收程式传送数据更简单,不需为两者间发生了什幺犯愁。这一协定提供了一定数量的特性,以供应多人游戏的需求,包括:
讯息的可靠和不可靠传输。可靠讯息将被重新传输直到接收程式收到它们。你可以分配传输类型为message-by-message。
讯息的连续和不连续传输。连续讯息将以它们发出时的顺序传送的接收程式。
讯息的分裂与组装。如果讯息尺寸超过特定网路的能力,DirectPlay自动分裂组装讯息。
阻塞控制。DirectPlay自动扼杀你发出的讯息到一个接收程式可以控制的极别。这一特性防止你因大最接收程式不能处理的讯息所造成的讯息泛滥。
传输优先权。为了保证最重要的讯息首先被发出。DirectPlay允许你指定讯息为低、中、高优先权。高优先权的讯息被传送到输出伫列的最前面,其后是中、低优先权讯息。
讯息逾时设定。为了防止送出的讯息伫列被很多当前的讯息延时的讯息阻塞,DirectPlay允许你为所有讯息设定一个逾时值。当一个讯息逾时时,它被从发出讯息伫列(outgoing message queue)删除,不管它发没发出。

DirectPlay 地址

为了能传递讯息,多人游戏中,每个参与者都必须拥有一个唯一(可识别的)地址。
地址可能会参照应用程式所在机器(设备地址)或者应用程式需要通信的机器(主机地址)而确定。
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包括一个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如何被恰当的执行。

DirectPlay创建和管理会话

一个游戏会话是一个特定的多人游戏的实例。一个会话具有两个或多个用户同时游戏,每个在他或她的计算机上具有同样的游戏客户端。一个玩家(player)是一个在游戏中自身的实体,并被特定游戏所定义。一个用户可能在一个游戏中具有不只一个的玩家角色。然而,游戏应用程式必须自己管理这些玩家,用对于每一个玩家单独的DirectPlay接口或对象。
创建会话的第一步就是集中一组用户。有两种方式:
1 大多数游戏会话都被一个运行在远程计算机上大厅程式(lobby application)所管理。这种方式被用于大多数基于Internet的游戏。
2、也可以通过单独的用户计算机与其它人的进行通信来管理游戏。这一方式被限定于一组所有潜在用户都在同一个区域网路中的情况下。
一旦会话被建立,游戏就被启动并且游戏玩家开始游戏。游戏进行中,玩家可能离开会话或者新的玩家加入。细节取决于特定的游戏。
在多人游戏中,每一用户的用户界面(user interface (UI))能被会话中的所有其它用户所同步。管理多玩家会话因而需要一个连续的从其它用户发出或到达其它用户的讯息流。例如,每次一个玩家移动,一条讯息必须被传送以在这一会话中的所有其它游戏客户端更新这一玩家的位置。DirectPlay的核心就是这一部分的API支持在所有在一个会话中的所有计算机间高效灵活的讯息机制。
有两种基本的一个会话讯息机制布局(topology)的结构的方法:一种是点对点,一种是客户/服务模式(peer-to-peer and client/server)。两种布局都有它们的优点和限制,因而你将需要评估哪一种更适合你的游戏。

标 签

搜索
随机推荐

Powered By 种豆资源网||