English 中文(简体)
如何在客户端和服务器端同步相同的对象在客户端 - 服务器应用程序中? 小消息框架是否适合这项工作?
原标题:
  • 时间:2009-01-02 17:22:29
  •  标签:

我正在使用C++和Python制作游戏引擎。我使用OGRE进行3D渲染,OpenAL进行声音,ODE进行物理,OIS进行输入,HawkNL进行网络,以及boost.python进行嵌入式Python解释器。每个子系统(库)都由一个类 - 管理器来封装,每个管理器都是单例的。现在,我有一个类 - Object - 这可以是游戏世界中的任何可见物体。这是一种混合,对象具有图形表示(实体)和物理模拟器中的表示(固体)。这两个是最重要的。类Object只是纯粹的抽象基类 - 接口。我决定在客户端实现ObjectClientSide上实现Object - 这个实现有实体,在服务器端实现为ObjectServerSide - 这个实现有固体。物理模拟器仅在服务器上运行,当然,渲染仅在客户端上完成。对象只能存在于两个实现共同工作时。每个对象都有唯一的ID,客户端和服务器端的相同对象实例具有相同的ID。

因此,在这个简短的背景之后,我的第一个问题是:这个设计好吗?我该如何让它变得更好?主要问题是:我应该如何同步这些对象?

接下来,两种实现具有相同的界面,但其一部分实现在服务器端,另一部分实现在客户端。所以,举个例子,如果玩家想让他的角色向前移动,他应该向服务器上的对象发送请求。然后服务器对模拟进行更改并将更新的位置发送到客户端。出于这个原因,我创建了一个小型消息框架。有一个Message类,Router,Rule和从Rule继承的规则。当消息到达时,Router会将其与规则进行检查并将其发送到目的地。所以,当我调用myObjectInstanceOnClientSide->setPosition(x,y,z)时,此对象将创建一个Message,其内容是函数和参数,目标是服务器上具有相同id的对象。当服务器端具有相同id的对象接收到此消息时,它将使用给定的参数调用此函数。因此,当一个函数不能在一侧实现时,它会创建一个消息并将其发送到另一侧的对象。我认为这在脚本中可能非常有用。脚本可以非常干净,如果脚本需要例如在客户端上打开动画,则只需在服务器端的本地对象上调用此函数 - 其余工作将在后台完成。

那么,这样可以吗?我对此错了吗?这是常见的解决方案吗?

问题回答

听起来你会发送很多小消息。UDP和IP头会增加28个字节的开销(IPv4头为20个字节或IPv6为40个字节加上UDP头的8个字节)。因此我建议将多个消息组合在一起以定期的速率一起发送。

您可能还想阅读以下其他问题和答案:

我多年前在 DevMaster.net Wiki 中添加了一些有用的链接,这些链接仍然相关: Network links

我建议开始阅读格伦·菲德勒的博客。他在网络物理方面做了一些非常出色的工作,包括最近发布的《雇佣兵2》。他开始撰写了一系列名为“面向游戏程序员的网络编程”文章。





相关问题
热门标签