gpt4 book ai didi

c++ - 如何在客户端 - 服务器应用程序中同步客户端和服务器端的相同对象?小消息框架适合这项工作吗?

转载 作者:行者123 更新时间:2023-11-30 00:42:33 27 4
gpt4 key购买 nike

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

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

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

那么,这样可以吗?我错了吗?这是通用解决方案吗?

最佳答案

听起来您会发送很多小消息。 UDP 和 IP header 将增加 28 个字节的开销(20 个字节用于 IPv4 header 或 40 个用于 IPv6 加上 8 个字节用于 UDP header )。因此,我建议将多条消息组合起来以周期性的速率一起发送。

您可能还想阅读这些其他问题和答案:

我添加了一个 bunch of useful linksDevMaster.net Wiki多年前仍然相关:

我建议开始阅读 Glenn Fiedler's blog .他在网络物理学方面做了一些令人难以置信的工作,包括最近的 Mercenaries 2发布。他开始了一系列名为 Networking for Game Programmers 的文章.

关于c++ - 如何在客户端 - 服务器应用程序中同步客户端和服务器端的相同对象?小消息框架适合这项工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/407464/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com