阅读: 8 评论: 0 作者: Maxice 发表于 2010-02-24 10:39 原文链接
Introduction To DirectPlay
翻译:杨冰(源代码之光)
E-Mail:iceryeah2000@163.com
创建时间:2002-9-11
最后修改时间:2002-10-1
备注:此章节是在翻译完Using 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。
评论: 0 查看评论 发表评论
找优秀程序员,就在博客园
最新新闻:
· 诺基亚两款概念手机Stealth/Dragonfly曝光(2010-03-09 09:45)
· IE6必须死 却没人做得到(2010-03-09 09:41)
· 南方日报:QQ的平台化价值是如何创造的?(2010-03-09 09:29)
· 报告称SNS网站功能趋于同质化(2010-03-09 09:26)
· 迫于压力 微软将修改浏览器选择界面算法(2010-03-09 09:09)
编辑推荐:史上最强女游戏程序员
网站导航:博客园首页 个人主页 新闻 闪存 小组 博问 社区 知识库