我正在用c ++和python制作一个游戏引擎.我正在使用OGRE进行3D渲染,OpenAL用于声音,ODE用于物理,OIS用于输入,HawkNL用于网络,boost.python用于嵌入式python解释器.每个子系统(库)都由一个类 - 管理器包装,每个管理器都是单例.现在,我有一个类 - 对象 - 这可能是游戏世界中的每个可见对象.这是某种混合,对象具有图形表示(实体)和物理模拟器中的表示(实体).这两个在这里最重要.Class Object只是纯粹的抽象基类 - 接口.我决定在客户端实现Object作为ObjectClientSide - 这个实现有实体,在服务器端有ObjectServerSide - 这个实现有实体.物理模拟器仅在服务器上运行,当然,渲染只在客户端完成.只有当两个实现一起工作时,该对象才能存在.每个对象都有唯一的id,客户端和服务器端的同一对象的两个实例都具有相同的id.
所以,在这短暂的背景之后,我的第一个问题是:这个设计好吗?我怎样才能让它变得更好?主要问题是:我应该如何同步这些对象?
接下来,两个实现都具有相同的接口,但其中一部分在服务器端实现,部分在客户端实现.因此,例如,如果玩家想要向前移动他的角色,他应该向服务器上的对象发送请求.然后,服务器对模拟进行更改,并将更新的位置发送给客户端.出于这个原因,我创建了小消息框架.从Rule继承的Message类,路由器,规则和规则.当消息到达时,路由器会根据规则对其进行检查并将其发送到目的地.因此,当我调用myObjectInstanceOnClientSide-> setPosition(x,y,z)时,此对象创建Message,其内容是函数,参数和destination是服务器上具有相同id的对象.当服务器端具有相同id的对象获得此消息时,它将使用给定的参数调用此函数.所以,当一个功能可以' 在一方面实现它创建一条消息并将其发送到另一方的对象.我认为这在脚本中非常有用.脚本可以非常干净,如果脚本需要例如在客户端上打开动画,我只需要在服务器的本地对象上调用此函数 - 其余部分在后台.
那么,这样可以吗?我错了吗?这个常见的解决方案?
听起来你会发送很多小信息.UDP和IP头将增加28字节的开销(IPv4标头为20字节,IPv6为40字节,UDP标头为8字节).因此,我建议将多个消息组合在一起以perioidic速率发送.
您可能还想阅读以下其他问题和答案:
处理网络游戏的延迟问题
实时多人游戏(概念问题)
我在几年前添加了一些有用的链接到DevMaster.net Wiki仍然是相关的:
游戏网络101常见问题解答
多人游戏和网络编程
多人游戏简介
编程Quake3网络模型
虚幻的网络架构
网络物理学
Beej的网络指南
我建议开始阅读Glenn Fiedler的博客.他在网络物理方面做了一些令人难以置信的工作,包括最近的Mercenaries 2版本.他开设了一系列名为Networking for Game Programmers的文章.