笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

我们使用帧同步网络物理模拟, 现在,在这篇文章中,我们将使用完全不同的技术对相同的仿真进行网络连接:快照插值。

随着玩家数量的增加,帧同步骤变得有问题:您无法模拟帧n,直到您从所有玩家接收到该帧的输入,所以玩家

最终等待最落后的玩家。 因此,我至多为2-4名玩家推荐帧同步技术,这也是帧同步广泛应用于竞技游戏的原因。

所以如果你的模拟不是确定性的,或者你想要更高的玩家数量,那么你需要一种不同的技术。 快照插值适非常适合。

在许多方面与帧同步相反:帧同步运行两个模拟,一个在左边和一个在右边,并使用同步输入保持它们同步,快照插值不运行任何模拟 右边一切!快照

插值不运行任何模拟右边一切!

相反,我们从左侧的仿真中捕获所有相关状态的快照,并将其传输到右侧,然后在右侧,我们使用这些快照重建模拟

的视觉近似,所有这些都不运行模拟本身。让我们发送渲染每个立方体所需的状态:

  struct CubeState{bool interacting;vec3f position;quat4f orientation;};

现在我已经确定,这项技术的成本增加了带宽使用。 大幅增加带宽使用率。 由于快照包含整个模拟的视觉状态,

有了一些数学,我们可以看到每个立方体可以串行化到225位或28.1字节。 由于在我们的模拟中有900个立方体,

这意味着每个快照大概是25千字节。

当我们以分组的形式发送快照数据时,我们在顶部包含一个16位序列号。 该序列号从零开始,并随着发送的每

个分组而增加。 我们在接收时使用此序列号来确定数据包中的快照是否比接收的最近快照更新或更早。 如果它更老,

那么它被丢弃。

每帧我们只是渲染右边收到的最新快照:

仔细观察,即使我们尽快发送数据(每帧一个数据包),您仍然可以看到右侧的挂起。 这是因为互联网不能保证每秒发送60次

的数据包相当于1/60秒的间隔。 数据包抖动。 一些帧您收到两个快照数据包。 其他帧你没有收到。

这实际上是一个很常见的事情,当你第一次开始网络。 您开始在局域网上玩游戏,并注意到您可以快速地砰击包(60pps),

并且大部分时间您的游戏看起来很棒,因为在LAN上,这些数据包实际上往往以与他们发送的相同速率达到.。

首先,我们来看看我们用这种天真的方法发送多少带宽。 每个数据包是25312.5字节加上28个字节的IP + UDP头和2个字节的

序列号。 每个数据包为25342.5字节,每秒60个数据包,总共每秒1520550字节或11.6兆比特/秒。 现在肯定有互联网连接,可以支

持这么多的流量...但是,老实说,我们并没有真正得到很多好处爆炸数据包每秒60秒,所有的抖动,让我们拉回来 每秒只发送10

个快照:

你可以看到 在右边没那么好,但是至少我们已经将带宽降低了6到2兆比特/秒。 我们肯定是朝着正确的

方向前进。

现在用快照的技巧。 我们所做的是,不是立即呈现接收的快照数据,就是我们在内插缓冲区中缓冲快照

时间短。 此插值缓冲区会持续快照一段时间,以便您不仅具有要呈现的快照,而且从统计学角度来看,您也

很可能拥有下一个快照。 然后,随着右侧时间的推移,我们在两个稍微延迟的快照之间插入位置和方向,提

供平滑运动的幻觉。 实际上,我们已经为平滑度交易了少量的延迟。

您可能会惊讶于使用线性插值10pps看起来有多好:

现在我们要处理丢包了,我确定你可以看到为什么我们永远不会考虑通过TCP发送快照。

快照时间是关键的,但不同于帧同步快照中的输入不需要可靠, 如果快照丢失,我们可以跳过它,

并插入内插缓冲区中的更新的快照, 我们不想停止,等待丢失的快照包被重新发送。 这就是为什么你应该始终

使用UDP发送快照。

上述的线性和高音插值画面不仅以每秒10包的发送速率记录,而且还记录在5%的分组丢失,+/- 2帧的抖动(60fps)。

如何处理这些视频的数据包丢失和抖动是通过简单地确保在插值之前在插值缓冲区中保存适当时间的快照。

我的经验法则是内插缓冲区应该有足够的延迟,这样我可以连续丢失两个数据包,并且仍然有一些插值。 实际上,

我发现在2-5%数据包丢失时效果最佳的延迟量是数据包发送速率的3倍。 每秒10个数据包,这是300ms。 我还需要一些

额外的延迟来处理抖动,在我的经验中,通常只有一个或两个帧(60fps),所以上面的插值视频以350ms的延迟被记录。

添加350毫秒延迟似乎很多, 但是每次数据包丢失时,您最终会挂起1/10秒。 人们

经常用来隐藏内插缓冲区在其他区域(如FPS,飞行模拟器,赛车游戏等)中添加的延迟的一种技术是使用外推法。 但是

根据经验,外推对于刚体是不正常的,因为它们的动作是非线性的和不可预测的。 在这里,您可以看到200ms的外推,

将总时延从350 ms缩短到仅150ms:

外推对物理模拟不了解, 外推不知道与地板的碰撞,所以立方体可以向下推出地板,然后弹回来纠正。

预测不知道弹簧力将玩家立方体放在空中,所以立方体最初向上移动比它应该更慢,并且必须抓住。 它也不知道

任何关于碰撞和碰撞反应如何工作,所以立方体滚动在地板和其他立方体也是错误的。 最后,如果你看到球,

你将会看到,外推可以预测所附立方体当它们与播放器立方体一起旋转时,沿其切线速度继续移动。

您可以想象,花费大量的时间来提高这种外推的质量,并使其了解立方体的各种运动模式。 您可以采取每个立方体,

并确保至少多维数据集不会通过地板。 您可以使用多边形之间的边界球添加一些近似碰撞检测或响应。 你甚至可以把这

个立方体放在卡塔马里的球中,使他们预测运动与玩家立方体一起旋转。

但是,即使你做了这一切,仍然会有错误的预测,因为你根本无法准确地匹配物理模拟和近似值。 如果您的模拟主要

是线性运动,例如。 快速移动的飞机,船只,太空船 - 你可能会发现一个简单的外推在短时间内(50-250ms左右)工作得很好,

但是根据经验,一旦物体开始与其他非固定物体碰撞,外推开始 分解。

我们如何减少内插的延迟量? 350ms仍然是不可接受的,我们不能使用外推来减少这种延迟,而不增加大量的不准确性。

解决方案很简单:增加发送速率! 如果我们每秒发送30个快照,我们可以获得相同数量的丢包保护,延迟150ms。 每秒60个

数据包只需85ms。

网络游戏之快照插值物理模拟相关推荐

  1. 网络游戏之帧同步物理模拟

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  2. Cocos 技术派:实时竞技小游戏技术实现分享

    前言 李清是来自华夏乐游BigRoad工作室的客户端主程,今日他将带来其团队制作的实时竞技小游戏<保卫豆豆-欢乐枪战>的技术实现方案. 游戏简介 <保卫豆豆-欢乐枪战>是一款北 ...

  3. Cocos 技术派第4期 | 实时竞技小游戏技术实现分享

    在前阵子举办的 Cocos 开发者沙龙上,来自华夏乐游 BigRoad 工作室的客户端主程李清,为现场开发者分享了其团队制作的实时竞技小游戏<保卫豆豆-欢乐枪战>的技术实现方案,深受开发者 ...

  4. 3D网游中人物的碰撞后反应控制

    人物移动控制是单机和网游中比较重要的部分,但前单机游戏使用动力学以及IK动画等已经达到了非常逼真的地步,在大型网络游戏中这样的物理模拟同步是很实现的,因此在目前多数网游中仍旧是采取使用一个包围体(盒子 ...

  5. Linux 之父恶评 Intel 漏洞修复补丁:完全就是垃圾!Intel:先别更新!

    2018年1月2日,英特尔曝出的CPU设计漏洞事件: 详解 Intel 漏洞怎么拿到内核数据的(附视频演示) 事件一经曝光,就迅速引起业内硬件同行.操作系统厂商.云供应商的迅速反应.如果不能从硬件层面 ...

  6. 游戏思考04:网络游戏同步算法产生原因和相关介绍:跟随(插值)、预测、延迟补偿,三种算法(未完待续02/07)

    文章目录 一.网络同步的典型场景 二.简单粗暴的数据同步为何行不通?(帧同步的难题) 1)网络同步的流程 2)网络延迟和抖动的直观解释 3)产生卡顿.瞬移的原因分析 4)测试网速网速 三.网络同步的优 ...

  7. 多人在线网络游戏的同步算法一 基础篇

    0 常识 1 在一款单机游戏中,玩家只需和本地游戏里面的元素(如AI,NPC等)进行实时交互即可. 2 而在多人在线网络游戏中,玩家还需要同联网的其他玩家进行互动,在本地看到的其他玩家,本质上,都是其 ...

  8. (转) 网络游戏实时动作同步方案手记

    和MMORPG不同,实时动作型网络游戏 追求操作的响应要求极高(<150ms). 动作型网络游戏的制作人希望做到单机游戏的体验,网络游戏的服务.      网络指令在多客户端间的同步算法,从原理 ...

  9. 网络游戏实时动作同步方案手记(1)

    [原创]网络游戏实时动作同步方案手记(1) by AKara 2010-09-07 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @wei ...

最新文章

  1. mysql8 mac 忘记密码_mac下 MySql 8.0.15忘记密码重置密码
  2. Sa身份登陆SQL SERVER失败的解决方案
  3. 64位 atol c linux_C 库函数
  4. Dapr 在阿里云原生的实践
  5. idea 无法打开项目_Premiere出现quot;项目看来已经损坏,无法打开”的解决方法...
  6. 精通Android开发 1
  7. 动态规划——数塔(hdu2084)
  8. Python Day10 MySQL 01
  9. 转:基于AOP实现Ibatis的缓存配置过期策略
  10. layui select下拉框选项不显示
  11. 微信小程序订阅消息 微信公众号模板消息
  12. CREO:CREO软件之零件【模型】、【分析】、【注释】、【工具】【视图】、【柔性建模】、【编辑】、【造型】、【渲染】的简介及其使用方法之详细攻略
  13. 洛谷试炼场 普及常见模板
  14. 一款用VBS编写的修仙风格打怪游戏
  15. 起点事件折射出网络文学产业化困境
  16. 【系统分析师】2022选择题上午考点
  17. 在堆区开辟内存(动态内存的开辟)
  18. 腾讯云运维工程师认证模拟题
  19. php图片点阵,HTML5边玩边学(八)-砖块贴图点阵字
  20. 答题小程序 服务器,答题小程序如何实现随机发题目

热门文章

  1. No Reference Video Quality Assessment with authentic distor-tions using 3-D Deep Convolutional Neura
  2. YLMF OS 和WINXP双系统安装方法及共存之最简单用boot.ini引导双系统方法
  3. 磁共振t1t2信号记忆顺口溜_10分钟记住脑出血核磁表现:T1、T2篇
  4. ASP.NET中@Page指令中的AutoEventWireup
  5. 短信群发平台 web网页版管理后台 路由通道搭建 源码架构的构思介绍
  6. 哈夫曼树原理及构造方法
  7. IDEA学习篇——findbugs 插件 下载、安装、使用详解
  8. 尽可能的白话SSR和PWA
  9. 手机app自动化操作工具airtest之入门篇
  10. 什么是知识图谱?有哪些典型应用?终于有人讲明白了