GJM :多人在线游戏的设计思路
多人网络游戏存在着不同层次的抽象。最高层的抽象概念即为客户端与服务器。
每个客户端维护单独的游戏中各玩家间的交互信息。
服务器作为所有客户端进行交互的中间媒介并且担当游戏的规则仲裁者的角色。
在任何一个多人游戏中,都存在着许多不同的角色(即“多人游戏”中的“多人”)。每一个角色都至少对应着一个现实生活中的玩家,他们通过运行在他们电脑上的客户端应用,以键盘、手柄及鼠标等各种方式进行交互。这些客户端把各自的交互信息(即行为)轮询提交给所在网络中(本地网或Internet)的服务器。游戏服务器通过维护整个游戏世界中的当前的、完全的游戏状态来管理这个游戏。
在游戏的单次轮询中,游戏服务器接收来自每个客户端的行为,并根据游戏规则对这些行为进行仲裁和应答,同时将游戏的状态更新返回给客户端。一收到新的游戏状态,客户端将立即显示它们同时准备接收新的用户行为。
因此,一个游戏循环的基本算法流程是这样的:
1、 客户端连接服务器
2、 客户端 从服务器接收游戏状态
3、 客户端 向用户显示游戏状态
4、 客户端向服务器发送用户输入行为
5、 服务器接收客户端的行为,通过游戏规则处理后更新游戏状态
6、 服务器发送新的游戏状态给客户端
7、 重复步骤2-6,直到客户端断开连接
客户端具有四个基本的功能特性:
1、 用户输入
2、 向服务器发送用户行为
3、 接收来自服务器的游戏状态
4、 图形显示
服务器具有三个基本的功能特性:
1、 用户输入
2、 运行游戏逻辑
3、 广播游戏状态
上述部分的相互关系见下图。
服务器在一个单独的逻辑位置来聚集游戏的信息并维护整个游戏的运行状态。
这项特性最为关键的地方在于,它简化了来自客户端一系列动作所导致的游戏状态更新的相关过程。它同时也消除了客户端与服务器之间游戏状态可能存在不同步的隐患。因为作为仲裁者的游戏服务器总是正确的。
这样的集中式管理也极大减少了客户端/玩家通过各种手段进行作弊的可能性。因为是游戏服务器来执行游戏的相关规则和逻辑的,它能确保每一个玩家都要服从于既定的规则之下。
成功编写出多人游戏存在着各种各样的挑战。这些挑战可以简单地归纳为以下四个范畴:
1、通信
2、同步
3、数据的持久化
4、网络的可伸缩性
前面两个部分包含了使一个多人游戏得以正常工作的基础细节。通信模块包括客户端和服务器两者之间的网络对话。同步处理模块涵盖了多个客户端同时进行访问以及修改那些被共享的游戏状态等相关的问题。
后两个部分则主要解决实现一个健壮的、高可靠性的游戏涉及到的部分。数据持久化模块确保了游戏服务器即使在当机或崩溃的情况下也能够正常地保存和归档游戏世界的各种状态。
弹性伸缩机制有助于你的游戏服务器在同时被数以千计的使用者访问时也能够保持稳定出色的表现。这些问题都是非常重要的且是难以正确有效地实现的。
总之,他们经常被认为是阻碍个人开发者或小型团队实现他们的多人游戏的最大难题。并且,正确地实现网络通信和同步处理并不是真正有趣的部分。我们真正感兴趣的在于编写游戏!
GJM :多人在线游戏的设计思路的更多相关文章
- 【坦克大战】Unity3D多人在线游戏(泰课的坦克大战--旋转的螺丝钉)
[坦克大战]Unity3D多人在线游戏 http://www.taikr.com/my/course/937 1.NetworkManager的介绍: 说明:选择固定生成时会自动寻找有StartPos ...
- 一个3D的多人在线游戏, 服务端 + 客户端 【转】
最近学院组织了一个实训,要求是利用Socket通信和D3D的知识, 写一个多人在线的游戏, 服务端是在linux下, 客户是在Windows下: 写这个的目的是想让大家给我找错, 欢迎大家的意见.我的 ...
- 试玩 GOWOG ,初探 OpenAI(使用 NeuroEvolution 神经进化)与 Golang 多人在线游戏开发
GOWOG: 原项目:https://github.com/giongto35/gowog 我调整过的:https://github.com/Kirk-Wang/gowog GOWOG 是一款迷你的, ...
- Unity3d多人在线教程
[转载]Unity3d多人在线教程 (2013-02-25 16:02:49) 转载▼ 标签: 转载 原文地址:Unity3d多人在线教程作者:lsy0031 Unity 多个玩家开发教程 Uni ...
- 7.地图随机装饰,与转化过程补充,与ai的设计思路
这两天本来只想实现地图的随机装饰,然后发现以前的bin格式设计存在不足,所以最后不得不去改地图,并去重制整个地图的阶段,此篇总结这个过程 先描述下bin结构 首先地图由无数六边形组合,一个六边形由两层 ...
- 负载均衡--大型在线系统实现的关键(上篇)(再谈QQ游戏百万人在线的技术实现)
http://blog.csdn.net/sodme/article/details/393165 —————————————————————————————————————————————— 本文作 ...
- 游戏数值——LOL篇 以LOL为起点-说游戏数值设计核心思路
附 文 文档在今年三月份我动笔写了一小部分,但当时思路凌乱,行文梗阻,于是丢在一边构思了半年,现在又回过头来慢慢写,希望能写好写完吧,初衷是希望即时萌新也能看懂,但是好像并不能行——本 ...
- Golang+Protobuf+PixieJS 开发 Web 多人在线射击游戏(原创翻译)
简介 Superstellar 是一款开源的多人 Web 太空游戏,非常适合入门 Golang 游戏服务器开发. 规则很简单:摧毁移动的物体,不要被其他玩家和小行星杀死.你拥有两种资源 - 生命值(h ...
- legend2---开发日志14(游戏对用户友好的设计思路)
legend2---开发日志14(游戏对用户友好的设计思路) 一.总结 一句话总结: 不强制,但是激励:比如宗门灵力等级从强制提升到提升宗门和用户的修炼速度 1.丹药有必要做成随机数值么? 没有 1. ...
随机推荐
- My first makefile to compile multiple C files
I have three files to compile: main.c, func.c, func.h The steps: 1 main.c to main.o 2 func. ...
- 搞懂 SynchronizationContext(第一部分)【翻译】
SynchronizationContext -MSDN 很让人失望 我不知道为什么,目前在.Net下关于这个类只有很少的资料.MSDN文档也只有很少的关于如何使用SynchronizationCon ...
- CocoaPods pod 安装、更新慢解决方法
使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update都卡在了Analyzing dependencies不动了,令人甚是DT. 每一次都忘记现在自己记录一下 ...
- JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?
今天群里有人聊图片上传,简单说下自己的经验(大牛勿喷) 0.如果你的方法里面是有指定路径的,记得一定要过滤../,比如你把 aa文件夹设置了权限,一些类似于exe,asp,php之类的文件不能执行,那 ...
- CSS系列:CSS3新增选择器
1. CSS1定义的选择器 选择器 类型 说明 E 类型选择器 选择指定类型的元素 E#id ID选择器 选择匹配E的元素,且匹配元素的id为“id”,E选择符可以省略. E.class 类选择器 选 ...
- MySQL 外键
在MySQL中 (1)MySQL 数据表主要支持六种类型 ,分别是:BDB.HEAP.ISAM.MERGE.MYISAM.InnoBDB.这六种又分为两类,一类是”事务安全型”(transaction ...
- 配置React Native环境
一. 安装Homebrew: “Homebrew installs the stuff you need that Apple didn’t.——Homebrew OS X 更完整”. Homebr ...
- PowerPoint基础
一.基础 默认后缀ppt,pptx office2003和以后的版本只支持ppt, 可以将pptx另存为ppt97-2003 二.修改PPT尺寸 三.新建幻灯片 四.字体与段落设置 五.主题与字体 六 ...
- 理解JAVASCRIPT 闭包
最近去面试了一家企业,结果非常灰心丧气,于是周末给自己定了一个目标 学好一门,学精通一门.不求多,只求懂. 最近看到一个概念“闭包”. 什么是闭包呢? 简单一点就是:看得到多和看得到少的区别. 上面这 ...