帧同步小记 刚问了公司另一个写服务器的大牛,赶紧记录下。 首先我们的游戏是强联网的格斗游戏。网络同步采用是帧同步技术。 帧同步的背景介绍:就是一个对于一个f(x) 函数,对于同一输入,输出结果一定相同。 依然接上个例子,服务器从某0时刻算起,到33ms 算第一帧 ,这个区间中间a玩家上传的挥刀 ,b玩家上传下蹲,服务器收到之后,在33ms这个点上就同步信息给玩家(这里所谓的同步具体代码层度上就是广播信息给玩家啦 上面说的这些就是帧同步核心的思想玩法,听完也没那么神秘的。回到这里的问题,就是指这个模块(或者说是函数),只负责这个帧同步消息的操作。 另外还有延迟的考虑,就是客户端一般收到的帧会有俩帧的延迟,作为服务器是收集输入信息到点就下发同步的。
今天介绍下音频帧、视频帧的主要参数和分析方法,以及音视频的同步等,主要内容如下: 音频帧 视频帧 PTS与DTS 音视频同步 音频帧 音频帧的概念没有视频帧那么清晰,几乎所有视频编码格式都可以简单的认为一帧就是编码后的一副图像 如采样率为 44.1KHz 的 MP3 音频文件每帧的持续时间为 1152 / 44100 * 1000 ≈ 26 ms,这就是经常听到的 mp3 每帧播放时间固定为26ms的由来。 上图中显示的顺序为: 1I1、B2、B3、B4、P5、B6、B7、B8、P9、B10、B11、B12、I13 编解码顺序为: 1I1、P5、B2、B3、B4、P9、B6、B7、B8、I13、B10、B11 ,则音视频可以看做是同步的。 实际情况是因为各种原因导致音视频不同步,如每帧解码和渲染的时长有差别,色彩丰富的视频帧可能就比色彩单一的视频帧解码渲染更慢以及计算的误差等,音视频同步方式主要有三种: 视频同步到音频 音频同步到视频 音视频同步到外部时钟
本博客总结自网络公开课 开发工具:Unity/服务器 开发语言C#/(C++ Lua) ---- 目录 帧同步如何同步 帧同步使用TCP还是UDP 帧同步的流程详解 如何克服UDP的时序和丢包问题 帧同步如何同步 帧同步:服务器把玩家操作同步给所有玩家,其他玩家在本地客户端根据服务器发过来的操作来推进游戏。 ; (3) next_frame_opt:每帧服务器将采集来的客户端的操作,都存放在这里:frameid = self.frameid, {有操作玩家的操作,有操作玩家的操作,有操作玩家的操作} (4) (14)如果上一帧的操作不为null,那么这个时候,我们处理下一帧之前一定要先同步上一帧的结果; 确保处理下一帧之前也都是同步的:在播放动画的帧与帧之间,我们会出现时间的差异,会导致位置等不同步;logic_pos : 66ms —>迭代计算出新的位置和结果;同一都以66ms来迭代; 帧同步:每帧都同步,处理下一帧之前,每帧都要同步;—>同样的输入—》同样的输出; (15)跳帧:快速的同步完过时的帧(即直接进行逻辑计算
什么游戏适合帧同步这种技术? 在现代多人游戏中,多个客户端之间的通讯,多以同步多方状态为主要目标。 帧同步的技术要点 帧同步游戏中,由于需要“每一帧”都要广播数据,所以广播的频率非常高,这就要求每次广播的数据要足够的小。最好每一个网络帧,能在一个MTU以下,这样才能有效降低底层网络的延迟。 因此我们常常会以冗余的方式——比如每个帧数据包,实际上是包含了过去2帧的数据,也就是每次发3帧的数据,来对抗丢包。也就是说三个包里面只要有一个包没丢,就不影响游戏。 你可以大概计算一下,如果我们的游戏有4个玩家,我们的冗余是3帧,那么一个下行的网络帧数据包大小会到128x4x3=1536字节,而每秒我们发15个网络帧,那么占用的带宽会到1536x15=23,040字节 我们做帧同步的目标是各个客户端都能看到一致的显示。
两种帧同步方式 1.状态同步:客户端发送游戏到服务器,服务器计算游戏行为的结果,然后通过广播下发各种状态,客户端收到状态后进行显示。 两种方式的比较: 帧同步方式广播的数据量比同步状态要小很多,当游戏中的对象特别多的时候,这种方式优势比较明显。相反状态同步能得到更多安全性上的好处,比较容易防止外挂。 帧同步 一般的帧同步系统中,有一个RelayServer负责广播(转发 )所有客户端的数据。为了让客户端持续运行,需要定时下发“网络帧”来驱动客户端。 每次发送数据128Byte,8个玩家,冗余帧2帧,一个网络帧数据包大小12882 = 2048字节,每秒发15个网络帧,占用带宽2KB * 15 = 30KB/S 3.降低广播数据量的方法: 多数游戏引擎位置数据采用浮点数 3.让每个客户端定时发送一个网络帧到服务器上,所有客户端收到完整的其他客户端的“心跳帧”才能开始一次游戏逻辑,这样让所有客户端互相等待,让游戏最大的平衡和流畅。
基于帧同步的游戏框架说明 一,关于帧同步和状态同步的比较 帧同步 状态同步 安全性 比较差,计算都在客户端,服务器只做转发;有服务器校验的方案,比较繁琐 计算都在服务器 可以将重要的判定都由服务器决定 网络流量 比较小,每一帧只同步玩家的操作指令 如果单位数量多,需要同步的数据量会比较大 技能实现 比较容易,只用客户端实现即可,开发周期短 需要服务器和客户端实现相同的运算逻辑,如果是不同的语言相当于要开发两次 3,断线重连比较复杂,通常需要客户端重头跑帧指令。 3,关于lockstep 简单的说就是游戏时间划分成一个一个的turn,每个trun玩家发送指令给服务器,服务器收集每个玩家的指令,在这一帧末尾广播给所有玩家;客户端收到指令后,执行相应的指令; 因为么个客户端的开始状态一致 ,那么经过相同的指令计算后,状态也应该是一致的;这就是帧同步的核心原理。
由于现在4g手机网络越来越普及,绝大多数用户的时延都可以在150ms以内,所以一些快节奏的帧同步网络游戏开始大行其道,现在最火的帧同步游戏无疑是某农药了。 帧同步技术除了可以用来做MOBA类游戏,同样可以用来做需要大量快速操作的格斗类游戏,本文就是尝试提出一些解决帧同步方案下格斗游戏的优化措施。 一般采用的策略有两个:一是定时同步。预渲染的角色,每隔200ms(可以设置成其他值),就停止运行,等待逻辑角色的状态和自己同步。 [1510297241073_8858_1510297285746.jpg] 总结 使用预渲染技术的最重要策略,还是坚持帧同步的原则:相同的输入,得到相同的输出。 而预渲染的方案,是把那些严格同步的游戏逻辑、与其表现区分开来,这样可以专门的去让画面看起来更流畅,同时不影响帧同步游戏的“一致性”。
1、像《王者荣耀》一样红过 2、从《王者荣耀》来聊聊游戏的帧同步 3、游戏服务器的架构演进 农药自从上线以来,依靠着强大的产品力以及腾讯的运营能力,在游戏市场上表现可谓是风生水起,根据第三方的调研数据显示 3、每次收到包,把收到的包上序列号变为确认字符,发送包的时候带上这些确认字符。 2、Lockstep—帧同步 帧同步可以说是通过帧率延伸过来的,你可以把一个游戏看成一个巨大的状态机,所有的参与者都采用同一个逻辑帧率来不断的向前推进。 我们来看看具体的执行流程: 上图中我们可以明显看到,这种囚徒模式的帧同步,在第二帧的时候,因为玩家1有延迟,而导致第二帧的同步时间发生延迟,从而导致所有玩家都在等待,出现卡顿现象。 不过这个还是无法解决帧同步的问题,因为严格的帧同步,是要等到所有玩家都输入之后,再去通知广播client更新,如果A服务器一直没有输入同步过来,大家是要等着的,那么如何解决这个问题?
这里只给出了RT2,也就是做帧中断交换机的设备的配置: <H3C>sy [H3C]fr switching [H3C]int s0/2/0 [H3C-Serial0/2/0]link-protocol fr [H3C-Serial0/2/0]fr interface-type dce [H3C-Serial0/2/0]fr lmi type q933a [H3C-Serial0/2/0]baudrate 103 interface s0/2/2 dlci 301 [H3C-Serial0/2/0]un shut [H3C-Serial0/2/0]quit [H3C]int s0/2/1 [H3C-Serial0 H3C-Serial0/2/1]baudrate 64000 [H3C-Serial0/2/1]fr dlci-switch 201 interface s0/2/0 dlci 102 [H3C-Serial0 /2/1]un shut [H3C-Serial0/2/1]quit [H3C]int s0/2/2 [H3C-Serial0/2/2]link-protocol fr [H3C-Serial0
音视频不能完全同步 : 音频播放时间线 和 视频播放时间线 不可能做到完全同步 , 音频播放 与 视频播放始终都处于一个相对对其播放进度的过程中 , 二者始终 处于你追我赶的过程中 ; 3 . ; ② 以以视频为基准进行同步 : 控制视频帧按照指定的帧率 ( FPS ) 播放 , 音频与视频同步 ; ③ 以一个外部时钟为基准 : 定义一个外部的开始时间 t , 音频 和 视频 都基于该时间进行同步 以音频为基准进行同步 : 视频时间线需要手动控制 , 音频的时间线是随着音频播放自动生成 , 因此以音频为基准进行同步 , 比较容易 ; 3 . B Frame ) : 需要参考前面的 I 帧 或 P 帧 , 和 后面的 P 帧编码成一张完整图片 ; 3 . ; 3 .
CSS3 中有一个 animation 属性,用它可以创建出帧动画。 例如下面的代码: .box{ margin: 40px; height: 100px; width: 100px; /* 可以一次性指定多个帧动画,每个帧动画用逗号隔开 当值的个数不多于动画帧个数时,多出的动画以第一个值为准。 a1 和 a3 会有过渡效果。 ; height: 30px; width: 30px; background-color: tomato; /* 动画的属性要与图片运动动画的属性一样,这样才能保持同步
一、游戏帧同步 1.简介 ·现代多人游戏中,多个客户端之间的通讯大多以同步多方状态为主要目标,为了实现这一目标,主要有两个技术方向:状态同步、帧同步。 5.帧同步 ·终于来到这一步了,如果玩家已经成功加入房间,就可以通过帧同步功能进行游戏对战。 5.1.开启帧同步 ·使用 room.startFrameSync 接口就可以开启帧广播。 该接口会修改房间帧同步状态为“已开始帧同步”。 中才是我们拿到帧同步内容的地方,见下文 }; 5.2.发送帧消息 ·玩家收到帧同步开始广播后,才可以发送帧消息,后台会将每个玩家的帧消息组合后再广播给每个玩家。 该接口会修改房间帧同步状态为“已停止帧同步”。
我们在做相机预览和视频流处理时,对每帧图像处理时间过长(超过 30 ms)就很容易造成画面卡顿,这个场景就需要用到错帧同步方法去提升画面的流畅度。 错帧同步,简单来说就是把当前的几帧缓冲到子线程中处理,主线程直接返回子线程之前的处理结果,属于典型的以空间换时间策略。 错帧同步策略也有不足之处,它不能在子线程中缓冲太多的帧,否则造成画面延迟。 错帧同步的原理 错帧同步的原理如上图所示,我们开启三个线程:一个主线程,两个工作线程,每一帧图像的处理任务分为 2 步,第一个工作线程完成第一步处理,第二个工作线程完成第二步处理,每一帧都要经过这两步的处理 2 错帧同步的简单实现 错帧同步在实现上类似于“生产者-消费者”模式,我们借助于 C 语言信号量 #include <semaphore.h> 可以很方便的实现错帧同步模型。 work_buffers)); work_thread_running = true; main_thread_running = true; index = 0; // 初始化 3
1)什么是I帧、P帧、B帧?2)什么是IDR帧?与普通I帧有何区别?3)什么是GOP?gop_size值如何设置画质会更好?4)OpenGOP & CloseGOP表示什么? I帧特点:1)I帧是一个全帧压缩编码帧;2)解码时仅用I帧的数据就可重构完整图像;3)I帧描述了图像背景和运动主体的详情;4)I帧不需要参考其他画面而生成;5)I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量 P帧特点:1)P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);2)解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;3)P帧属于前向预测的帧间编码,它只参考前面最靠近它的 比如在对同一个视频进行多码率转码时,如果指定 IDR 帧对齐(IDR Frame Alignment),则意味着所有输出视频的 IDR 帧在时间点、帧内容方面都保持精确同步,此时播放器便可实现多码率视频平滑切换 PTS主要用于解码阶段进行视频的同步和输出,全称是Presentation Time Stamp,为显示时间戳。在没有B帧的情况下,DTS和PTS的输出顺序是一样的。
2、英雄的设计包括整个技能的感觉 3、一些非常有特色的英雄,它的技能、反馈、体验上面都是做的不错(这是基于帧同步技术方案的优势) 1.1 术语 打击感:(反馈、特效、音效、准确性) PVP 指玩家对战玩家 比如30帧/s,你所看到的画面就比较流畅了。而帧率越高你所看到的越流畅。 这也就是为什么电影胶片是一格一格拍摄出来,然后快速播放的 游戏中的所有动画也是采用这种方式来渲染,只不过帧率是由GPU来控制,一帧帧地渲染 帧同步 帧同步可以说是通过帧率延伸过来的,你可以把一个游戏看成一个巨大的状态机 在两三周你就可以做出 Demo,易上手是一个非常大的优势 1.2 涉及的技术(游戏同步方案) 同步的本质是一致性的问题,目的是:在同一局多人游戏的过程中,玩家A看到玩家B的状态,应该跟玩家B自身看到自己的状态相一致 造成不一致的本质原因:延迟 假设理想情况下双方的网络时延都为0,那两者应该是同步的,但是在现实情况中,往往是不可能的, 1.2.1 同步机制:cs状态同步 1.2.1.1 什么是状态同步?
在视频压缩编码中,所有的帧被分成了三个种类,I帧,B帧和P帧,其实就是Intra-Prediction帧,Bi-prediction帧和Prediction帧。 顾名思义,就是帧内预测帧,双向预测帧以及(单向)预测帧。 (inter prediction),帧内预测的话就是在找参照块的时候,只在当前帧内寻找;而帧间预测的话,找参照块的时候会在相邻的帧之间去找相似块。 因此,基于上述所说, 如果说当前帧是只在当前帧内寻找参照块的话,那么该帧就是I帧 如果在已经编码的帧里面寻找参照块的话,那么它是P帧 如果既在已编码的帧里去寻找参照块,又在未来将要被编码的帧里去寻找参照块的话 ,那么该帧就是B帧。
由于压缩处理的方式不同,视频中的画面帧就分为了不同的类别,其中包括:I 帧、P 帧、B 帧。I 帧是内部编码帧(也称为关键帧),P 帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。 简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码。 I 帧 I 帧(Intra coded frames):I 帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。 由于 I 帧不依赖其它帧,所以是随机存取的入点,同时是解码的基准帧。 I 帧主要用于视频播放的初始化,I 帧图像的压缩倍数相对较低。I 帧图像是周期性出现在图像序列中的,出现频率可由编码器选择。 P 帧是差别帧,P 帧没有完整画面数据,只有与前一帧的画面差别的数据。 若 P 帧丢失了,则视频画面会出现花屏、马赛克等现象。
“帧”这个词在中文里通常是“frame”的翻译,出现在计算机网络、音视频处理、操作系统等多个技术领域。它之所以叫“帧”,是因为它有“一整块结构化数据”的含义,像一张照片、一张画框,代表某个完整的单位。 在网络通信中:帧(Frame) 是数据链路层传输的基本单位,通常包括: 帧头(Header):比如目标地址、源地址 数据(Payload):实际传输的内容 帧尾(Trailer):比如校验信息(CRC ) 为什么叫帧? 在音视频中: 视频帧(Video Frame):一张静止图像,多个帧连在一起就是视频。 音频帧(Audio Frame):一小段音频数据。 同样的原因叫“帧”,因为每一帧是一个可以单独处理、播放的完整单元。总结一句话: 帧(Frame)是指一组结构完整、边界清晰、可以独立传输或处理的数据单位。
文章目录 一、 游戏帧相关概念 二、 MonoBehaviour#Update() 帧更新方法 三、 帧更新时间统计 四、 设置游戏更新帧率 一、 游戏帧相关概念 ---- 游戏画面由 连续的 帧 Frame Update() 方法 就是 帧更新 的方法 , 每次 更新 画面帧 时 , 都会 调用该方法 , 也就是一秒钟调用几十次到一百多次 ; 在 Unity 游戏中 , 如果要 更新 游戏物体 GameObject 当前组件附着的 游戏物体 GameObject 移动到 (4.0f, 4.0f, 4.0f) 坐标位置 this.transform.localPosition = new Vector3( 当前组件附着的 游戏物体 GameObject 移动到 (4.0f, 4.0f, 4.0f) 坐标位置 this.transform.localPosition = new Vector3( 当前组件附着的 游戏物体 GameObject 移动到 (4.0f, 4.0f, 4.0f) 坐标位置 this.transform.localPosition = new Vector3(
本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/ 2 梳理解析 LoRaWAN第3章,主要是讲了接收窗口这回事,只要记住张图就行。 3 源码分析 3.1 源码流程 在梳理这章节的对应代码时,自己手动做了张思维导图。有时是这样,代码再有层次感,也不及一个图。好,请收下。