Understanding DirectPlay(2) 作者:杨冰(源代码之光) E-mail:iceryeah2000@163.com 创建时间:2002-9-26 最后修改时间:2002-10-15 备注:被部分翻译的是DirectPlay Lobbies章节。主要讲述了DirectPlay的大厅机制。
目录: DirectPlay Lobbies DirectPlay Lobby Architecture Lobby Servers Lobby Clients Communicating with a Lobbyable Game Lobbyable Applications Launching a Lobbyable Application
正文:
DirectPlay Lobbies 大厅(lobby)的主要目的是安排用户使用多个网络游戏,这样的机制使不同类型的游戏集合在一起,有利于管理和用户选择。大厅程序通常运行在远程服务器上。用户访问大厅(可通过多种方式:通过互联网/局域网建立一个会话或加入一个会话都可以访问大厅)。大厅程序然后会连接运行(launch)组里的游戏,游戏这时就开始运行。 因为大多多人游戏都是拥有大厅的,基于DirectPlay的游戏一般都支持大厅程序。这部分就是讨论如何使DirectPlay游戏具有支持大厅的功能。
DirectPlay Lobby Architecture 安排和管理基于DirectPlay多人游戏会话的过程包括五个独立的组件。大厅服务端程序是第三方组件(通过互联网在远程服务器上运行)。其余的四个组件都被安装在用户计算机上。 1 大厅客户端(Lobby client)。大厅客户端是用来和大厅服务器(lobby server)进行联系通讯的。它主要是通过DirectPlay大厅客户端对象(lobby client object)和用户的游戏程序进行通讯。 2 支持大厅的游戏(Lobbyable game application)。它使用DirectPlay lobbied application object(大厅游戏程序对象)和大厅客户端进行通讯,然后再通过大厅客户端与大厅服务端进行联系。 3 DirectPlay大厅客户端对象(DirectPlay lobby client object)。 4大厅游戏程序对象(DirectPlay lobbied application object)(从lobbied被动式来讲,这是对游戏程序,表示该游戏支持大厅,可我找不到恰当精炼的语言来表达) 上面两个DirectPlay对象扮演了连接游戏程序和大厅客户端的角色。他们通过私有平台彼此进行联系。下面的图表示了关系和如何进行通讯联系的。(图片未复制,SDK有)
Lobby Servers 大厅服务器主要目的是安排角色和管理游戏。它一般建立在远程服务器上。大厅服务器通常还具有主持聊天,发送新闻,商品交易等功能。 要管理多人游戏,一个大厅服务器一般要做以下任务: 1 管理安排各个游戏会话和玩家的网络地址。 2 通过相应的游戏程序来连接相应的会话。 3 将角色加入现有的会话中。 4 保持会话中的电脑到正确的网络地址。 5 追踪会话的状态变化,诸如角色的离开或改变游戏主机。 具体的大厅服务器工作细节依具体的情况而定,但主要任务必须包括上述内容。
Lobby Clients 大厅客户端是负责与大厅服务端连接的程序,它被安装到每个玩家的电脑上。它负责玩家和他们的游戏程序,以及服务端之间的通讯。一个安装大厅客户端通用的方法是叫用户在游戏服务主页上进行下载。 大致的步骤如下: 1 新用户到网站上注册。 2 作为注册的一部分,客户端被下载到用户的电脑上。 3 用户决定玩哪个游戏,并进入该游戏会话。 4 网站开始连接用户电脑上的客户端程序。可以通过URL来指向一个客户端执行文件。 5 大厅客户端安排会话,并运行用户指定的游戏程序。 6 如果该游戏具有支持大厅功能,大厅客户端启用该游戏程序,让游戏程序直接和大厅服务端进行通讯。这个连接使大厅服务端保持追踪用户进入或者退出游戏的事件。 大厅客户端并不是必须和远程服务器进行连接。用户运行大厅客户端后,客户端会列出有效的游戏和会话。一旦用户选择了一个游戏和会话,大厅客户端则开始连接运行该游戏。 这部分讨论的是大厅客户端的一般知识。在Communicating with a Lobbyable Game.中会有对大厅客户端和其连接的大厅服务端更多的讨论。
Communicating with a Lobbyable Game 我们可以通过多种方便的方法让大厅客户端和与其相联接的大厅服务端进行通讯。DirectPlay在下面具体介绍了大厅客户端和支持大厅功能的游戏程序如何进行通讯。 大厅客户端不能直接的和游戏程序进行通讯。它是通过大厅客户端对象(CLSID_DirectPlay8LobbyClient)来和游戏程序通讯的。这个对象是从IDirectPlay8LobbyClient界面获得。如果游戏程序具有大厅功能,则此程序的客户端对象负责传递消息。用如下步骤使用IDirectPlay8LobbyClient对象。 1 在用户系统上枚举支持大厅的游戏。 2 连接游戏,如果此游戏没有运行,则连接它到会话中。 3 从会话中释放此游戏,并且关闭和大厅客户端的连接。 4发送消息给已经连接的游戏。 Note 大厅客户端可以运行任何程序,不管此程序是否具有支持大厅功能。不过,只有支持大厅的游戏程序才能使用DirectPlay去和大厅客户端进行通讯。 大厅客户端对象和大厅客户端进行通讯是通过回调函数进行的。函数指针在初始化期间被传递到大厅客户端对象。回调函数发送的消息如下: 1 连接信息。 2 连接状态。 3 会话状态,其中包括连接的,未被连接的和主持会话的主机。 4 从游戏程序发送到大厅客户端的消息。 运行(launch)一个程序 当你运行一个程序,你可以试图传递一个关于游戏具体情况的数据块给程序。当支持大厅的游戏被一个大厅客户端运行,则此游戏创建和初始化一个支持大厅程序对象(lobbied application object)。信息则通过此对象被传递到游戏。 当lobbied application object被初始化,则大厅客户端接收到消息来判断用户是否已经被连接。传递这个信息的主要目的就是为了让大厅客户端知道此游戏是否具有支持大厅功能。如果大厅客户端在运行此游戏的一段时间内,没有接收到这样的连接信息,则表示此游戏不具有支持大厅功能。你就可以停止这次连接。 运行程序后 此期间,大厅客户端和正在运行的支持大厅游戏相比没有作很多的工作。依靠游戏拓扑,大多的用户信息被直接发送到游戏服务器。不过,DirectPlay在发生断开连接和主机时,发送消息给大厅客户端。这些消息是为了让大厅客户端知道服务器当前的状态。比如,如果主机改变,大厅服务端会更新UI,指示新的主机。 游戏也能向大厅客户端传递消息。这些消息可以包括任何内容,它能被用于任何目的。大厅客户端一般传送数据给大厅服务端去处理。比如,在游戏的结束时,游戏可能会发送一段消息告诉大厅服务端,有新的分数纪录产生,请更新最高分列表。
Lobbyable Applications 具有大厅功能的程序(Lobbyable applications,翻译繁琐,以后直接引用英文)被设计直接和大厅客户端进行工作。当大厅客户端使用DirectPlay运行程序,Lobbyable applications在此时会显现出如下优点: 1 当游戏状态改变时,大厅客户端自动接收更新信息。 2 大厅客户端可以使用标准API来和游戏进行通讯。 3 游戏同时也能使用标准API来和大厅客户端进行通讯。 总之,DirectPlay实际上消除了游戏本身对网络通讯的硬编码。你可以在任何时候使用标准API或者基于其上,通过少量修改达到游戏的网络通讯要求。 在Launching a Lobbyable Application会有更多的关于lobbyable application的信息。 如果想知道lobbyable application具体的工作机理,查看Implementing a Lobbyable Application章节和SDK中SimplePeerhe和StagedPeer例子。
Launching a Lobbyable Application 当Lobbyable Application被运行后,首要做的是创建一个支持大厅功能程序对象。这个对象将赋予程序判断它是否真的被大厅运行。Lobbyable Application必须通过消息管理回调函数接收从大厅客户端发送的消息。从下列步骤来完成: 1 创建Lobbyable Application对象。 2 初始化该对象。 3 如果初始化返回一个有效值,则游戏被大厅连接运行。 4 检验在初始化阶段返回的用户的索引(context value)。这里包含着游戏的具体信息。 5 检验从lobbied application发送过来的连接消息。此消息中包括消息发送ID,依据此ID来给发送消息到大厅客户端。 当游戏成功的被大厅连接运行,DirectPlay就能自动的发送状态更新信息给大厅客户端。要开启自动状态更新机制,在IDirectPlay8Peer, IDirectPlay8Client, 或 IDirectPlay8Server接口中调用RegisterLobby。你也可以使用lobbied application接口来发送消息给大厅客户端。 需要注意的是,你的消息回调函数可能在大厅客户端初始化以前就接收到消息,除了接收到连接信息,大厅客户端改变连接设置或断开连接时,回调函数也会接收到消息。大厅客户端也能直接的发送消息到你的消息管理器上。 Note 最好使用多线程来接收消息。为了正确的管理消息,lobbied application回调函数应该具有多入口(re-entrant)。
|