网络游戏同步法则

转自:http://www.cppblog.com/keigoliye/archive/2009/09/12/95986.html
网络游戏同步法则

网路的硬件也有限,而人的创造也无限,在公网平均130ms的Latency下,是不存在“完全的”的同步情况。如何通过消除/隐藏延时,将用户带入快速的交互式实时游戏中,体验完美的互动娱乐呢?

以下六点,将助你分清楚哪些我们可以努力,哪些我们不值得努力,弄明白实时游戏中同步问题关键之所在,巧妙的化解与规避游戏,最终在适合普遍用户网络环境中(200ms),实现实时快速互动游戏:

1. 基本情况:
   (A) 网络性能指标一:带宽,限制了实时游戏的人数容量
   (B) 网络性能指标二:延时,决定了实时游戏的最低反应时间

2. 两个基本原则:
   (A) 让所有的用户屏幕上面表现出完全不同的表象是完全没有问题的。
   (B) 把这些完全不同表象完全柔和在一个统一的逻辑中也是完全没有问题的。

3. 同步的十二条应对策略:
   (A) 最大可能减少游戏中的数据传输
   (B) 将阻塞通信放到线程池中实现
   (C) 永远不要为了等待某个数据而不让游戏进行下去
   (D) 利用预测和插值改进游戏的效果
   (E) 当使用预测插值的时候传送的数据不仅包括坐标,还需要速度和加速度
   (F) 将输入数据枷锁或者队列化(例如键盘消息队列),直到下次发送数据的时刻,传统的方法是在固定的时间(发送数据前)检测键盘,在游戏的原理上隐藏延时
   (G) 使用事件调度表,将需要在所有用户客户端同时发生的事件,提前广播到所有用户
   (H) 使用多次攻击来杀死一个精灵,尽量减少一次性的、确定性的、延时敏感的事件
   (I) 延长子弹或者火箭在空中飞行的时间(在其飞行的同时,在所有客户端进行预测插值)
   (J) 所有物体从一个地方移动到另外一个地方都需要时间,避免诸如“瞬间移动”的设计
   (K) 尽量使游戏中所有精灵,飞船或者其他物体,都按照可预测的轨迹运行,比如在移动中增加惯性
   (L) 充分发挥创造力,尽最大可能的合并游戏中前后相关的事件,合并游戏中存在的延时此问题,需要在技术上改进的同时也需要策划有所重视,规避一些影响较大的设计,巧妙的隐藏"延时"

4. 同步问题现状:
   (A) 重视程度不够:很多人尚未意识到此问题的存在,曾有公司花半年时间打算做一款“松鼠大战”的网络版。
   (B) 技术上无彻底解决方案:对于多数程序员,单机游戏技术善未成熟就匆匆步入网络时代。
   (C) 研究这个技术需要条件:需要有实力的公司才能提供,无此条件,即便有能力的程序员也无法成功。

5. 目前网游的三大技术难题:
   (A) 服务器的响应问题:如何使服务器在支持越来越多的人数的情况下提供最高的响应。
   (B) 同步问题:如何在有限的网络响应情况下,实现快速实时类游戏,提供最完美的交互。
   (C) 服务器分布式问题:如何在统一用户数据的情况下,利用分部式将各个分散的“世界”统一到一个“世界”中。
   谁能真正解决好以上三个问题,配合策划在设计上的突破,将使其他人在至少两年内无法超越。
   
6. 相关补充:
   (A) 网格技术现在还是抄作,真正用到游戏中,还有很多技术难点需要突破(比如:目前网格的单位计算时间是以秒计算).
   (B) 其实与很多人想法相反的是现在3D技术早已不是主要的矛盾。而现在国内外对于以上三个问题可以说处于同一个起跑线上,完全有机会取得先机。
   (C) 现在解决同步问题已经很紧迫,而同时所需要的环境也已经成熟,只要有所关注,半年之内可以得出较成熟的结论


那么具体怎么解决呢?再下一步怎么办?
这就得自己去实践了,我只说这么多了,哈哈,不然又教懒了那些成天再网上搜方案的人。



MMO的同步策略目前已经没有什么秘密可言了,简单叙述下各要素: 


MMO人行走:MMO中如果是鼠标点击行走传目的地+中间寻路接点就行了,服务器简单验证一下。如果是键盘控制行走的话,需要做简单的预测插值。 

MMO打怪:要看怎么个打法,客户端根本不必管服务端什么时候传来消息,直接演示动画就行了,最好把被砍的过程动画做长一点,可以在播放动画的过程中等待服务器传过来的延迟敏感事件,比如--该人已死。这样处理起来比较容易,最重要的是客户端看起来要流畅。 

MMO插值:所谓“把不同表象柔和在一起”算法很多,简单的可以参考DR,位置不同的时候可以做一次线性插值,直接把人拉扯过去,或者二次线形插值,做一条平滑的曲线修正,看具体项目选择了。 

时钟:就是时钟同步,所有时钟都是以“贞”为单位的,服务器主逻辑循环可以是5-10fps,多则无益,客户端同样维持一个和服务端频率相同的消息同步贞。 

时间贞:把ping值加到时间计算里面是多余的,按贞计算的话,服务端告诉客户端在n贞发生xx事件的时候,客户端收到的时候如果客户端贞数大于n,说明是发生过了的,那么做插值,如果小于n,说明是未来发生的,那么加入时间表。 


1 游戏中的行走,则是一个需要同步的重头戏,当今游戏分成两种同步方式,一种是以服务器端为准,如果发现客户端的坐标和服务器的坐标不符合的话,则拉回。这点的好处是可以弥补瞬移外挂的出现,但在网络环境差的情况下,则出现游戏不流畅。

所 以,我比较推荐使用以客户端计算为准的方法(当然是我因为我这个游戏对游戏流畅性要求很高),客户端向服务器发送计算好的数据,服务器经过一定的预测判 断,广播给其他玩家,这个虽然是能引起和wow一样的问题,瞬移外挂,但完全可以从游戏设计方面进行根本避免。(这里就不谈策划方面的问题了)

2 游戏的战斗,战斗的同步性要求也相当高,这里我也引用楼主说的,在固定时间检测键盘,以一定频率发送攻击消息,这里有一个关键,就是服务器和客户端都进行 攻击判定,即使服务器中没有攻击判定成功,但在客户端判定成功,也要播放攻击效果。不过一切计算效果以服务器为准。这是一个欺骗玩家的手段。

posted on 2009-09-12 10:39 暗夜教父 阅读(1788) 评论(2)  编辑 收藏 引用 所属分类: Game Development

转载于:https://www.cnblogs.com/shiweihappy/p/4246461.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】关于eval( )

为什么80%的码农都做不了架构师?>>> 一、eval() 动态执行时使用当前函数的闭包。 var i 100; function myFunc(ctx) {var i test;eval(var test "hello."); //test执行后为局部变量 } myFunc(); // 输出值100 alert(i); 二、eva l() 访问…

在ASP.Net Core和JAVA中,使用Azure配置密钥——Key Vault

思路浅析 在软件开发中,项目安全是重中之重,特别是在多部门或者开源项目中,如何保存我们的密钥,但又不影响本地的开发,更需要我们开发者需要考虑的问题,这里简单的列举了下平时开发中我们做的…

我怀疑对象做了什么对不起我的事......

1 狗狗已经这么明显提醒你了▼2 传销老总都怕的传销......▼3 和一只狗撞衫了▼4 你信吗?我跳水不会湿头发!▼5 东北雪糕行业繁荣的原因还挺在理▼6 打了个平手?▼7 缅甸网红苏娜英腰围35公分她还想减▼8 哈哈哈哈▼你点的每个赞&…

jQuery 事件和动画

jQuery 事件和动画 上回说到jQuery的选择器,大家都应该知道了,jQuery的使用可以让我们少写很多的代码,达到一个轻量级的效果,那么既然都有选择器等等方便,那么事件的使用肯定也是不可能缺少的,另外还加入一…

Android之用SingleTask和TaskAffinity解决手机截取的项目启动页面问题

今天做的远程截屏功能,服务端发一个命令下来,然后客户端截屏,截屏的代码已经写好,因为是跨进程通信的,我最后采取的办法是启动activity来实现的,但是问题来了,如果用户没有登录的情况下,可以截屏到任何页面,但是登录了之后,不在本应用里面切换的话,会回到应用的页面…

html怎么用excel打开乱码,我的Excel表格打开就乱码了,请问该如何修复?

回答: 第一种方法:采取直接修复最新版本的Excel具有直接修复受损文件的功能,大家可以利用Excel新增的“打开并修复”命令,来直接检查并修复Excel文件中的错误,只要单击该命令,Excel就会打开一个修复对话框&…

汽车模型身上出现反射效果

博客列表: www.1111kp.info, www.163123.info, www.360111.info, www.360123.info, www.6699ysk.info, www.aaafaipiao.com, www.bbbkp123.info, www.fp1111.info, www.fp1234.info, www.fpfuzhou.com, 3dsmax导出的模型,默认材质是漫反射(diffuse&…

记一次 .NET 某市附属医院 Web程序 偶发性CPU爆高分析

一:背景 1. 讲故事这个月初,一位朋友加微信求助他的程序出现了 CPU 偶发性爆高,希望能有偿解决一下。从描述看,这个问题应该困扰了很久,还是医院的朋友给力,开门就是 100块 红包 🤣&#x1f923…

执行CMD命令

可以执行多条命令,用“\r\n”分割 1 using System;2 using System.Diagnostics;3 4 namespace Tool5 {6 7 public class CMDHelper8 {9 public static string[] ExeCommand(string commandText) 10 { 11 12 Process p new Pr…

[iOS]应用内支付(内购)的个人开发过程及坑!

本文基于XcodeVersion 7.3 (7D175)版本,手机是iPhone 6,9.3系统。 一. 创建测试App 首先你需要登录 App的ItunesConnection,你会看到如下界面 简单的介绍一下这几个选项 1.我的App主要用于管理自己的App应用,例如编辑资料&…

Android之Intent 序列化反序列化

我们做截屏功能的时候,因为有2个进程,本来是把intent和MediaProjection放到Application里面,但是由于跨进程了,所以数据拿不到,就采用了Parcel 序列化出错,未找到出错的原因,找其它的解决方法: 查看Intent 的源代码, 发…

农商银行招聘计算机人员考什么,农商银行招聘考试题都考什么?

整理了农商农商一、行政职业能力测试类农商银行行测考试题型主要以选择题形式出现。主要包括言语理解、数量关系、判断推理、资料分析、常识五大部分。二、英语类农商银行考试英语部分:一般银行英语考试内容包括英语词汇与语法、英汉互译、改错、完型填空和阅读理解…

一步步学习微软InfoPath2010和SP2010--第八章节--使用InfoPath表单Web部件

本章中,你将学习到: 1. 配置Web部件设置 2. 创建Web部件连接 3. 创建表单参数 4. 使用其他浏览器表单参数 你可以使用InfoPath表单Web部件(Microsoft SharePoint2010新引入的)在SharePoint企业版或Microsoft…

讲一讲应用服务的新鲜事儿

微软中国MSDN 点击上方蓝字关注我们为了新功能的发布,以及 Linux 和 Windows 的改进,Azure App Service 团队付出了非常多的努力。很开心的是,我们看到了 Windows Containers 的正式版本,并可应用于 App Service 环境 v3 上。此外…

运维自动化之基于python语言的文字界面的运维管理软件

之前开发了phpmysqlshell运维监控系统,监控起来很方便,但在运维管理方便还是不能实现,所以最近打算使用python语言编写一套的运维管理系统,可以使用单台或多台机器同时管理与部署等功能,实现类似func、triaquae等管理软…

Android之4.0新特性

Android 4.0 平台 API等级:14 Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性。在下面我们将讨论的所有新特性和API中,因为它将 Android 3.x 版本中广泛使用的API和全息图像主题带给了小屏幕设备,因此我们说 Android 4.0 是一次重要的平…

iOS中的动画

2019独角兽企业重金招聘Python工程师标准>>> iOS中的动画 Core Animation Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,使用它需要添加QuartzCore .framework和引入对应的框架<QuartzCore/QuartzCore.h>…

Debian7 apt源设置

刚装完系统时是没有 apt-spy 的&#xff0c;这时候我们可以暂时先找个可用的源代替&#xff0c;如&#xff08;写在 /etc/apt/sources.list 中&#xff09;&#xff1a; deb http://http.us.debian.org/debian/ stable main 执行以下命令更新软件包列表&#xff1a; apt-get up…