游戏开发之网络游戏中服务器端与客户端分别处理哪些事?

根据情况不同,客户端做的事情都有不同。

服务器至少要做验证。

相对于网络游戏来说,数据传输量在一定程度上可以忽略,而更注重数据来回时间。在一般情况下,比如说WOW里面,200MS延迟就开始变黄。也就是说在一般对时间要求不是很极端的,比如KOF97转到MMO,200可以默认为一个普通MMO的标准线。

具体来说,理想上的网游,个人倾向于所有逻辑处理全放服务器端,而客户端就像个媒体播放器。这是因为如同某本书讲得,客户端是掌握在对手手中,如果你让服务器只起到数据交换作用,那么外挂就可以彻底糟蹋你的游戏。

在理想基础上,客户端要做的事就是表演,根据服务器和用户的输入处理,进行各种场景、动作与特效的播放。包括绘制角色(动态物件)、绘制场景(相对静态物件)、绘制光照、物件、光照排序、动态物件动画的播放。

当然这是基于理想基础之上的,实际上的制作会有很多变化。比如休闲游戏,因为它要求响应比较迅速(比如泡泡堂,加速后的角色跑起来的速度飞快,你怎么保证其他客户端能够实时看到对方所在位置。不然就炸不到了),所以在这种需求之下,客户端开始承接更多的活计,比如客户端不单是播放功能,还加上了判断,先执行了客户端的判断去追求表演的流畅性。当然,为了安全,最后数据一样要通过服务器端验证,验证不通过就纠正回来。又因为纠正很粗暴,所以现在还开始增加一些纠正机制,让纠正的过程看上去柔和些,比如WOW里面,有时候你会看到其他怪物或角色拖着速度线飞快的移动到其他地方,那就是柔和纠正机制。

用具体事例来说,举个例子:聊天。一个游戏如此设定,一个玩家当使用“当前频道”时,只能让周围50米的玩家收到。

于是。玩家A输入了一堆话,这个时候客户端接收,并立即发送到服务器端。

服务器端固定周期处理一次所有聊天信息,比如200毫秒,客户端送到的时候,正好上一个200毫秒过去了,于是排在下一个200毫秒的队列里。这个时候任何客户端是没办法看到聊天信息的,包括A端(假定是这么设定的,这个就是有的时候你网络卡的时候,明明按了回车,对话框却不冒出任何聊天信息的原因)。

时间在流逝,服务器开始跑队列,并跑到这个地方了,于是它开始运算,第一是判断这句聊天对话是当前频道、世界频道还是其他,判定结果是当前,于是执行当前频道的处理:读取这个玩家所在位置,搜索这个位置方圆50米的其他玩家,向这些玩家包括A端广播聊天信息(假如还有黑名单功能,还要剔除黑名单玩家;假如付费用户字体还有特殊颜色,还要传播这个对话的风格)。

所有客户端收到信息,然后再聊天频道里播放这条信息。于是大家都看到了。

而基本上这整个过程,包括玩家位置信息,包括玩家聊天内容,大小不可能超过1KB,就算是加密后。也就是这种数据量在正常情况下是可以忽略的。这个也是一般网络游戏的传输数据量标准。更重要的是两个参数,第一玩家信息包传送到服务器并由服务器返回的时间;第二服务器处理事件的周期。

而除了UI位置这些琐碎无关于角色的信息,其他信息都应该保存在服务器端。保存在客户端的应该是资源,包括角色模型、动画、场景、特效等,部分游戏也将大量文本保存在客户端,比如任务对话。而重要信息,特别是任何将对自己或其他玩家有影响有改动的信息都应该放在服务器端。比如角色的经验、甚至比如你接到的任务(如果你保存在客户端,你换台机,以前接到的任务就都没了)。

至于客户端向服务器端什么时候发送消息,多少频率,那一般是个长连接,只要信息量没超过KB,影响都不太大。实际上,只要你登录以后,服务器端和客户端就一直在相互通信。哪怕你不动,服务器都会因为你有可能接受到聊天信息而不停的给你塞消息。所以这个还是让程序去头疼,他们是专业。

事情大体上就是这样。

更多内容,请访问【狗刨学习网】unity极致学院
http://edu.gopedu.com

时间: 2024-08-08 09:26:31

游戏开发之网络游戏中服务器端与客户端分别处理哪些事?的相关文章

Unity3D游戏开发之网络游戏服务器架构设计培训(如何做一名好主程)

在我们初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发.后面就应该朝着主程的方面前进 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1.服务器跑在什么样的操作系统环境下?2.采用哪几种语言开发?主要是什么?3.服务器和客户端以什么样的接口通讯?4.采用哪些第三方的类库? 除了技术背

Unity3D游戏开发之网络游戏服务器架构设计培训

下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1.服务器跑在什么样的操作系统环境下?2.采用哪几种语言开发?主要是什么?3.服

基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)

接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 1 bool PlaneWarGame::init() 2 { 3 bool bRet = false; 4 do 5 { 6 CC_BREAK_IF(! CCLayer::init()); 7 8 _size = CCDirector::sharedDirector()->getWinSize(); 9 10 // 设置触摸可用 11 this->setIsTouchEnabled

mvc中服务器端、客户端属性验证

在mvc中使用表单进行数据提交时,数据验证分为服务器端验证和客户端验证: 我们可以通过使用HtmlHelper中的方法及在页面中引用js库对Model的属性的数据注解进行解析,实现前端.后端的数据验证: HtmlHelper.数据注解在其他文章中再详细介绍,本文主要介绍如何使数据验证发生作用. 下面分别介绍两种验证方式: 一.服务器端验证 要实现服务器端的验证非常简单,只需要满足下面三个条件: ①有数据注解 ②页面部分使用HtmlHelper生成各种表单元素 使用这些html标签的时候,需要引用

【cocos2d-x游戏开发】cocos中的三种缓存类

Cocos中有三种缓存类: (1):纹理缓存:TextureCache (2):精灵帧缓存:SpriteFrameCache (3):动画缓存:AnimationCache 游戏最要重要的就是流畅度,如果我们的游戏经常因为加载资源出现卡顿的情况,那么这个游戏就没有很好地游戏体验.所以,为了解决这个问题,缓存就应运而生了. 缓存的目的就是:现将所需资源加载到内存中,之后再次使用该资源的时候,就可以直接从内存中读出,而不需要重新加载,从而减少了CPU和GPU的内存占用. TextureCache 在

【Unity3d游戏开发】Unity中的Time.timeScale

马三最近在做一款游戏的时候涉及到了“加速”和“暂停”这两个功能,我第一时间就想到了应该用 Time.timeScale.当暂停的时候,设置timeScale = 0,当需要加速的时候,将 timeScale 设置为 n 倍即可.但是代码写到一般的时候,我就有些发懵,当 timeScale 数值被改变的时候,Update .LateUpdate.FixedUpdate 是否还是安装之前的频率来执行呢?当 timeScale = 0时,Update 是不是会不执行了? 一.之前错误的认知 在这之前我

【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术

一.引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得从头来再玩一遍.那玩家一定会掏出准备已久的西瓜刀~) 其实Cocos2d-x引擎早已为我们开发者封装好了多种数据存储的类或者方法,包括简单信息的存储,文件的读写,SQLite数据库和RAR格式的压缩文件的读取等等.(用心良苦啊!)其中大部分的存储功能被封装到了UserDefault类中. 二.数据存

【Unity3d游戏开发】Unity3D中的3D数学基础---向量

向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3D数学知识. 一.向量概念及基本定义 1.向量的数学定义 向量就是一个数字列表,对于程序员来说一个向量就是一个数组. 向量的维度就是向量包含的"数"的数目,向量可以有任意正数维,标量可以被认为是一维向量. 书写向量时,用方括号将一列数括起来,如[1,2,3] 水平书写的向量叫行向量 垂直书

3D图形学在游戏开发中的,矩阵,四元数,欧拉角之间的底层转换算法。

在游戏开发的过程中难免会遇到欧拉角和四元数直接的转换问题,如果有些过shader的朋友,肯定也遇到过四元数,欧拉角和矩阵直接的转换问题,这里我把这几种格式直接的转换算法写在这里有需要的朋友可以拿去有,别忘了,点赞关注.废话不多说,直接上代码. 四元数转矩阵的底层算法: public Quaternion QuaternionMatrix(float w, float x, float y, float z) { Matrix4x4 matrix = new Matrix4x4(); matrix