godot帧同步-关于“显示与逻辑分离”

很多教程说帧同步的关键是“显示与逻辑分离”,但是又没有具体讲解,我起初也没有搞懂这句话的意思,就直接上手开发帧同步了。在开发的过程中,一下子就悟了,所以分享一下。

显示与逻辑未分离(单机)

func _physics_process(delta):

    # 一些处理(如伤害判断)

func _on_animated_sprite_2d_animation_finished() -> void:
	if $AnimatedSprite2D.animation=="斩击":
		set_process(false)
		$AnimatedSprite2D.play("后摇")
	if $AnimatedSprite2D.animation=="后摇":
		queue_free()

看上面这个代码,在“斩击”动画过程中,进行伤害判断。“斩击”动画结束后,播放“后摇”动画,并停止process处理。在“后摇”动画结束后,删除节点。

这就是“显示与逻辑未分离”,每一步操作都依赖于动画的播放进程。

显示与逻辑分离(多人游戏帧同步)

1.帧同步的前置要求

简单提一下,看不懂就算了。

在帧同步中,每一个涉及到物理操作(如移动)的节点(怪物节点,子弹节点),都不应该执行自己的_physics_process()函数,而是要和核心场景的clientFrame同步的。若网络慢,核心场景clientFrame没有累加,那么该节点也不应该执行物理操作。

下面是例子,所有的process中的操作,都应该由Muti_game节点控制

func update_bullet():
	var bullet_arr = get_child(2).get_children()
	for _item in bullet_arr:
		_item.do() # 手动执行一次物理
	pass

func update_player():
    ···

func update_monster():
	var monster_arr = get_child(1).get_node("Land/Monster").get_children()
	for _item in monster_arr:
		_item.get_node("FSM").do_() # 手动执行一次物理
	
func updateClient():

	if logicFrame==lastSyncFrame:
		···	
	if lastSyncFrame>logicFrame+1:
		···
	if lastSyncFrame==logicFrame+1:
        clientFrame+=1 # 客户端帧

		update_monster() # 更新怪物
		update_bullet() # 更新子弹
		update_player() # 更新玩家

		if clientFrame==(logicFrame+1)*GameControl.ClientServerFrameRate:
			logicFrame+=1

func _physics_process(delta):
	updateClient()
	sendInput()

2. 分离

多人模式下,我们禁用了节点的_physics_process(),并将其中的内容提取为do函数,供核心场景调用。

我们还把基于动画的操作步骤,替换为了基于参数atk_num和houyao_num。

var atk_num = 60 # 斩击持续的帧数
var houyao_num = 30 # 后摇持续的帧数
func do():
    if houyao_num<=0:
        # 切换到待机状态
        pass
	if atk_num<=0: # 斩击结束
        $AnimatedSprite2D.play("后摇")
        houyao_num-=1
		return
    if atk_num>0:
        # 一些处理(如伤害判断)
        pass
	atk_num-=1 # 计数更新

func _physics_process(delta):
    if 处于多人模式:
        return
    do()
 

# func _on_animated_sprite_2d_animation_finished() -> void:
	# if $AnimatedSprite2D.animation=="斩击":
		# set_process(false)
		# $AnimatedSprite2D.play("后摇")
	# if $AnimatedSprite2D.animation=="后摇":
		# queue_free()

3. 分析 

为什么要分离。下面举反例。

假如有两个客户端A与B。

客户端A在 0s 时刻收到了来自第n帧的“斩击”指令,创建了斩击节点,并开始播放斩击动画,持续1s。

客户端B在 0.5s 时刻收到了来自第n帧的“斩击”指令,创建了斩击节点,并开始播放斩击动画,持续1s。

然后客户端A和B都在 1.2s 时刻收到了来自第n+1帧的“do”指令

因为客户端A的斩击动画在1s 时刻播放完毕,并开始播放了后摇动画,所以do操作没有进行伤害判断。

而客户端B的斩击动画将在 1.5s 时刻结束,此时仍在播放,故do操作进行了伤害判断。

以上过程,造成了不同步现象

如果我将斩击的持续时间,量化为atk_num呢?可以自行推演一下,是否能够解决不同步现象

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《系统架构设计师教程(第2版)》第18章-安全架构设计理论与实践-02-安全模型

文章目录 1. 安全模型概述1.1 信息安全的目标1.2 安全模型 2. 状态机模型2.1 概念2.2 状态机模型工作步骤 3. Bell-LaPadula模型3.1 概念3.2 模型安全规则3.3 示例 3. Biba模型3.1 概念3.2 模型安全规则3.3 示例 4. Clark-Wilson模型&#xff08;CWM&#xff09;4.1 概述4.2 模…

低代码赋能汽车制造产业链场景系列

当前汽车行业数字化智能化转型浪潮下&#xff0c;整车及其上下游产业链的协同创新正变得至关重要。头部车企与上下游供应链企业正逐步解决在生产管理、业务互通、系统集成等方面的痛点与挑战。电动化、智能化、网联化作为汽车产业的三大趋势&#xff0c;正共同推动未来汽车产业…

记录一些yolo-world训练数据集的报错

参考的这个文章 https://blog.csdn.net/ITdaka/article/details/138863017?spm1001.2014.3001.5501 openai快捷下载&#xff1a;https://download.csdn.net/download/qq_43767886/89876720 然后我打算训练coco数据集&#xff0c;遇到了以下的问题 问题一 原因&#xff1a;…

AWS MySQL 升级(三)—— TAZ - 近0停机的小版本升级方案

与AWS交流了解到的新方案&#xff0c;没有实际试过&#xff0c;所以本篇主要是些原理 一、 TAZ的含义 TAZ实际上就是 3 AZ&#xff0c;扩展一些就是 Multi-AZ DB Cluster&#xff0c;即在3个可用区部署DB&#xff0c;具备两个只读备用实例。 二、 TAZ的主要用途 1. 近0停机的小…

Sublime快捷键的使用和修改

sublime快捷键 1.选择类 CtrlD 选中光标所占的文本&#xff0c;继续操作则会选中下一个相同的文本。 AltF3 选中文本按下快捷键&#xff0c;即可一次性选择全部的相同文本进行同时编辑。举个栗子&#xff1a;快速选中并更改所有相同的变量名、函数名等。 CtrlL 选中整行&#…

基于Web的停车场管理系统(论文+源码)_kaic

摘要 我国经济的发展愈发迅速&#xff0c;车辆也随之增加的难以想象&#xff0c;因此车位的治理也越来越繁杂&#xff0c;为了方便停车位相关信息的管理&#xff0c;设计开发一个合理的停车位管理系统尤为重要。因而&#xff0c;具有信息方便读取和操作简便的停车位管理系统的设…

Qt和c++面试集合

目录 Qt面试 什么是信号&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;&#xff1f; 什么是Meta-Object系统&#xff1f; 什么是Qt的MVC模式&#xff1f; 1. QT中connect函数的第五个参数是什么&#xff1f;有什么作用&#xff1f; 3. 在QT中&#xff…

Linux使用Docker部署Paperless-ngx结合内网穿透打造无纸化远程办公

文章目录 前言1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux系统本地部署Paperless-ngx开源文档管理系统&#xff0c;并结合cpolar内网穿透工具解决本地部署…

Redis持久化机制(RDBAOF详解)

目录 一、Redis持久化介绍二、Redis持久化方式1、RDB持久化(1) 介绍(2) RDB持久化触发机制(3) RDB优点和缺点(4) RDB流程 2、AOF(append only file)持久化(1) 介绍(2) AOF优点和缺点(3) AOF文件重写(4) AOF文件重写流程 三、AOF和RDB持久化注意事项 一、Redis持久化介绍 Redis…

plpo vue实战版教程

vue实战版教程 什么是plpo安装1.将plop添加到您的项目2.全局安装plop(可选&#xff0c;但建议使用方便)3.在项目根目录下创建一个 plopfile.js vue 实战&#xff08;后台管理系统 - 增删改查&#xff09;所需文件文件介绍创建配置文件 plopfile.js创建模板和脚本命令文件模板创…

ELK中L的filebeat配置及使用(超详细)

上一次讲解了如何在linux服务器上使用docker配置ELK中的E和K&#xff0c;这期着重讲解一下L怎么配置。 首先L在elk中指的是一个数据处理管道&#xff0c;可以从多种来源收集数据&#xff0c;进行处理和转换&#xff0c;然后将数据发送到 Elasticsearch。L的全称就是&#xff1…

dbeaver_导入到数据库中的csv文件显示黑色方块

dbeaver_导入到数据库中的csv文件显示黑色方块 ** 解决方案&#xff1a; ** 数据库导出到CSV用Excel打开中文乱码问题

H3C OSPF 综合排错实验

H3C OSPF 综合排错实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址&#xff0c;所有路由器配置环回口 IP 地址为 X.X.X.X/32​ 作为 Router-id&#xff0c;X 为设备编号&#xff08;R7 除外&#xff09;按照图示分区域配置 OSPFR1 和 R6 上分别配置环回口来模拟业务网段…

【华为】基于华为交换机的VLAN配置与不同VLAN间通信实现

划分VLAN&#xff08;虚拟局域网&#xff09;主要作用&#xff1a; 一、提高网络安全性 广播域隔离访问控制增强 二、优化网络性能 减少网络拥塞提高网络可管理性 sysytem-view #进入系统视图配置参数 vlan batch 10 20 #批量创建vlanLSW3: int g0/0/1 port …

MYSQL 事物隔离级别的区别与现象

事物的ACID属性本章不再赘述&#xff0c;本章主要描述事物的隔离级别及隔离级别导致的现象&#xff0c;日常工作中该如何选择MYSQL的隔离级别。 MYSQL事物的隔离级别及各隔离级别存在的问题如下&#xff1a; 隔离级别/问题脏读不可重复读幻读读未提交(Read-Uncommitted)✅✅✅…

PostgreSQL学习笔记四:GUI管理工具

PostgreSQL 是一款广泛使用的开源关系数据库管理系统&#xff0c;拥有许多图形用户界面&#xff08;GUI&#xff09;工具来帮助用户更高效地管理数据库。以下是一些流行的 PostgreSQL 管理工具&#xff1a; pgAdmin&#xff1a; 一个流行的开源 PostgreSQL GUI 工具&#xff0c…

半周期检查-下降沿发上升沿采

1. 半周期路径Half Cycle Path 如果在设计中&#xff0c;同时存在上升沿触发的D触发器&#xff0c;以及下降沿触发的D触发器&#xff0c;则视为半周期路径&#xff0c;Half Cycle Path。 2. Setup time检查 时序图 时序报告&#xff1a; 起始点 startpoint&#xff1a;UFF5&a…

Jenkins+kubernetes流水线构建java项目

在传统的业务环境中&#xff0c;我们的应用部署或者更新都是采用手工的方式&#xff0c;但是在企业内部&#xff0c;应用架构一般都采用微服务&#xff0c;大部分项目都会对应几十个、上百甚至上千个微服务&#xff0c;并且还不仅仅只有一个项目&#xff0c;所以采用收工方式上…

微信小程序开发-配置文件详解

文章目录 一&#xff0c;小程序创建的配置文件介绍二&#xff0c;配置文件-全局配置-pages 配置作用&#xff1a;注意事项&#xff1a;示例&#xff1a; 三&#xff0c;配置文件-全局配置-window 配置示例&#xff1a; 四&#xff0c;配置文件-全局配置-tabbar 配置核心作用&am…

【Linux】————进程控制

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux专栏 创作时间 &#xff1a;2024年10月10日 ​ ​ 一、程序地址空间&#xff1a; 1、C/C中的程序地址空间&#xff1a; ​ 在c中我们了解了这样的空间分布图。 我们应如何去创建和访问变量呢&#xff1f;…