游戏中帧同步的实现

简介

帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏,常见于dota类和RTS类游戏,如端游中的dota,dota2,梦三国等;手游中的王者荣耀,自由之战等。

过程

帧同步的过程可以简述为:

  1. 各客户端实时上传操作指令集;
  2. 服务端保存这些操作指令集,并在下一帧将其广播给所有客户端;
  3. 客户端收到指令集后分别按帧序执行指令集中的操作。

示例

目前我们正在做的是一款格斗手游,下面是我们项目中使用的同步算法主要伪代码:

1 各客户端实时上传操作指令集

def op_fun():
    net.send_lock_step_data(cmd)

2 服务端保存指令集,并在下一帧广播指令集

def update_lockstep_data(self, cmd):
    """保存操作指令"""

    role_ctrl_data = self.lockstep_data.setdefault(‘c‘, {})
    ctrl_data = role_ctrl_data.setdefault(self.uid, {})
    ctrl_data.update(cmd)

def on_lockstep(self, tid):
    """定时器响应函数,广播操作指令"""

    self.lockstep_frame_index += 1  # 帧序增加,开始帧同步时初始为0
    self.broad(self.lockstep_data)
    self.lockstep_data = {‘i‘: self.lockstep_frame_index, ‘t‘: time.time()}  # 更新数据,为下一帧做准备

3 客户端处理收到的帧数据

def recv_lock_step_data(self, data):
    self.lockstep_datas.append(data)

def update(self):
    frame = self.lockstep_datas[0][‘i‘]
    if frame == self.lockstep_frame:
        ls_data = self.lockstep_datas.pop(0)
        ctrl_datas = ls_data.get(‘c‘)
        if ctrl_datas:
            uid_list = ctrl_datas.keys()
            uid_list.sort()
            for uid in uid_list:
                self.process_lockstep_ctrl_data(uid, ctrl_datas[uid])  # 将操作指令给指定玩家
        self.lockstep_frame += 1

另外,帧同步还有一点比较重要,要保证各个客户端随机种子相同,各个实体排序也必须一样。

小结

我们用的是乐观帧同步,服务端不会每帧等待每个客户端数据,防止其他客服端被开始;

使用帧同步的好处是各个客户端可以保证数据的高度一致性,带来的问题是调试相当麻烦,需要添加很多的log,来判断具体是那一帧开始不同步,才能进一步的找出为什么不同步。

时间: 2024-10-17 09:21:33

游戏中帧同步的实现的相关文章

Unity3D RTS游戏中帧同步实现

帧同步技术是早期RTS游戏常用的一种同步技术,本篇文章要给大家介绍的是RTX游戏中帧同步实现,帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏,想要了解更多帧同步的知识,继续往下看. 一.背景 帧同步技术是早期RTS游戏常用的一种同步技术.与状态同步不同的是,帧同步只同步操作,其大部分游戏逻辑都在客户端上实现,服务器主要负责广播和验证操作,有着逻辑直观易实现.数据量少.可重播等优点. 部分PC游戏如帝国时代.魔兽争霸3.星际争霸等,Host(服务器或某客户端)只当接收到所有

Unity 3D实现帧同步技术

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 现在竞技类网络游戏比较火,市面上也出现了很多这种类型的游戏竞赛,提到网络游戏就回避不了一个问题:同步技术,多个人在一个游戏场景围攻一个怪物或者说多人组队战斗等等.现在在移动端的游戏由

位同步(比特同步)和帧同步的区别是什么?

在数据通信中最基本的同步方式就是“位同步”(bit synchronization)或比特同步.比特是数据传输的最小单位.位同步(比特同步)是指接收端时钟已经调整到和发送端时钟完全一样,因此接收端收到比特流后,就能够在每一位的中间位置进行判决(如下图所示).位同步(比特同步)的目的是为了将发送端发送的每一个比特都正确地接收下来.这就要在正确的时刻(通常就是在每一位的中间位置)对收到的电平根据事先已约定好的规则进行判决.例如,电平若超过一定数值则为1,否则为0. 但仅仅有位同步还不够.因为数据要以

什么是游戏中的帧同步

游戏中的帧同步是一种客户端与服务器的同步方式,是为了实现高实时性的需求而设计的.在实时pvp游戏中,要求每个客户端高度同步,怎么做到精确的同步呢,那就是向同步的所有客户端广播同步消息.由于网络存在延迟,因此一个客户端发送消息给服务器的过程存在延迟,服务器广播同步消息给其他客户端也存在延迟,为了降低这个延迟,服务器应该尽量减少逻辑,快速地转发消息让客户端能够同步,因此在帧同步中,游戏的逻辑计算应该放到客户端来实现,服务器在收到消息后应该迅速地进行广播,而不应该做过多的逻辑计算.既然是客户端进行计算

游戏中的网络同步机制——Lockstep(帧同步)

本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockstep/#top 值得参考文章:https://blog.codingnow.com/2018/08/lockstep.html 可参考的项目工程:https://github.com/CraneInForest/LockStepSimpleFramework-Shared 0x00 前言 每个人或多或

帧同步在竞技类网络游戏中的应用

帧同步在竞技类网络游戏中的应用 帧同步在网上可以搜的资料比较少,关于游戏的更是没有,不过,实现的原理也比较简单,最近几天就写了份关于帧同步的文档,当作给同事扫扫盲,顺便也在这里发发,可以给其他人参考参考     --竞技类网络游戏设计方案   一.        前言 帧同步,根据wiki百科的定义是,一种对同步源进行像素级同步显示的处理技术,对于网络上的多个接入者,一个信号将会通过主机同步发送给其他人,并同步显示在各个终端上.同步信号可以是每帧的像素数据,也可以是影响数据变化的关键事件信息.

让蔡徐坤来教你实现游戏中的帧动画(下)

拖了将近一个月,终于把帧动画这部分写完了,新关注的或者已经忘记的小伙伴可以看一下之前写的部分: 让蔡徐坤来教你实现游戏中的帧动画(上) 让蔡徐坤来教你实现游戏中的帧动画(中) ? 今天这个还是在上一篇的基础上进行修改的,主要讲解的如何在帧动画中添加事件,Cocos Creator 提供了两种添加事件的方式:可视化编辑帧事件和动态注册帧事件,下面将对这两种方式分别介绍. 没看过官方文档的小伙伴建议先熟悉一下官方文档哦! https://docs.cocos.com/creator/manual/z

手游帧同步的研究

网络游戏的同步可以做的很简单,也可以做的很复杂.简单来说就是通过Http或者Socket来跟服务器同步数据.而如果往复杂了说,可以有p2p.帧同步.航位预测等等高级课题可以研究. 因为我们的项目需求----几百个独立单位的实时同步(带pvp的rts),所以研究了下帧同步.不过后来发现它其实有很多问题,所以具体如何还要看其他同事的研究成果.以我个人来说,修改游戏方案反而是最合理的解决方案. 首先从需求上来说,几百个独立单位的作战,本身结果和士兵强弱从策划的角度来看就是不可控制的.玩家更加不可控制.

游戏中逻辑线程和逻辑线程的并行

为什么要将游戏的渲染线程和逻辑线程分离? 游戏中渲染是一个非常耗时的操作,特别是相对复杂的游戏,渲染通常会占据一帧中的大部分时间.而高品质的游戏都会要求FPS在60,所以一帧的时间仅仅16毫秒. 如果要在16毫秒内完成逻辑和渲染双重的任务,对于大型游戏来说,通常是艰难的,即使在极度优化的情况下,也可能只能满足性能较好的设备,在性能较差的设备上,几乎不可能在16毫秒内完成所有任务. 所以如果将渲染线程和逻辑线程分离,那么理论上,他们各自都有16毫秒的时间来完成各自的任务,因为他们是并行进行的,这样