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

news2024/12/25 22:33:54

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

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

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.coloradmin.cn/o/2205773.html

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

相关文章

嵌入式中单链表基本实现

第一:单链表基本原理 依次读入表L=(a0,.....,an-1)中每一元素ai(假设为整型),若ai≠结束符(-1),则为ai创建一结点,然后插入表尾,最后返回链表的头结点指针H。 第二:单链表具体实现方法 1:实现单链表的时候,需要先定义基本文件link.h #ifndef __LINKLIST_H__ #define…

考华为认证拼了命,怎么还是没工作啊

在当今竞争激烈的就业市场中&#xff0c;网络工程领域的发展备受关注。当你疯狂地在某 BOSS 或者某联等招聘平台上浏览时&#xff0c;你必然会惊讶地发现&#xff0c;华为认证已赫然成为网络方向至关重要的资格认证之一&#xff0c;频繁地出现在形形色色的岗位 JD 里。 这一现…

如何设置 GitLab 密码长度?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 60天专业…

【RabbitMQ——消息应答机制——分布式事务解决方式】

1. RabbitMQ高级-消息确认机制的配置 NONE值是禁用发布确认模式&#xff0c;是默认值 CORRELATED值是发布消息成功到交换器后会触发回调方法&#xff0c;如1示例SIMPLE值经测试有两种效果&#xff0c;其一效果和CORRELATED值一样会触发回调方法&#xff0c;其二在发布消息成功…

UE5 TimeLine入门

UE5 TimeLine入门 时间轴曲线 共计三个关键帧&#xff08;0,0&#xff09;(1.5,10) (3,0) 蓝图 1.按下空格键执行。 2.时间轴TimeLine函数。 3.动画播放结束后执行。 4.每一帧都执行。

GR-ConvNet论文 学习笔记

GR-ConvNet 文章目录 GR-ConvNet前言一、引言二、相关研究三、问题阐述四、方法A.推理模块B.控制模块C.模型结构D.训练方法E.损失函数 五、评估A.数据集B.抓取评判标准 六、实验A.设置B.家庭测试物体C.对抗性测试物体D.混合物体 七、结果A.康奈尔数据集B.Jacquard数据集C.抓取新…

Java—继承性与多态性

目录 一、this关键字 1. 理解this 2. this练习 二、继承性 2.1 继承性的理解 2.1.1 多层继承 2.2 继承性的使用练习 2.2.1 练习1 2.2.2 练习2 2.3 方法的重写 2.4 super关键字 2.4.1 子类对象实例化 三、多态性 3.1 多态性的理解 3.2 向下转型与多态练习 四、Ob…

使用node.js控制CMD命令——修改本机IP地址

设置每次打开cmd命令行窗口都是以管理员身份运行&#xff1a; 1. 按下Ctrl Shift Esc键组合&#xff0c;打开任务管理器。 2. 在任务管理器中&#xff0c;点击“文件”菜单&#xff0c;选择“运行新任务”。 3. 在“创建新任务”对话框中&#xff0c;输入cmd&#xff0c;勾…

无人机之信息管理系统篇

一、系统概述 无人机信息管理系统通过整合软件和硬件设备&#xff0c;实现对无人机的全面监控、管理、调度和数据分析。它能够帮助用户实时掌握无人机的飞行状态、位置信息等重要数据&#xff0c;确保飞行安全和隐私保护。 二、系统组成 无人机信息管理系统通常由以下几个关键…

达梦8-SQL日志配置与分析工具

以 dmsql_数据库实例名.log 类型命名的文件为跟踪日志文件&#xff0c;跟踪日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。跟踪日志主要用于分析错误和分析性能问题&#xff0c;比如&#xff0c;可以挑出系统现在执行速度较慢的 SQL 语句&#xff0c;进而对其…

React学习过程(持续更新......)

React学习过程&#xff08;持续更新…&#xff09; 创建react的hello项目 使用node创建create-react-app脚手架项目 //首先你得先安装node&#xff0c;这里不做详细教程&#xff0c;我使用的node为20.18.0 npm isntall create-react-app -g //全局安装create-react-app crea…

Web安全常用工具 (持续更新)

前言 本文虽然是讲web相关工具&#xff0c;但在在安全领域&#xff0c;没有人是先精通工具&#xff0c;再上手做事的。鉴于web领域繁杂戎多的知识点&#xff08;工具是学不完的&#xff0c;哭&#xff09;&#xff0c;如果你在本文的学习过程中遇到没有学过的知识点&#xff0…

【笔记】Day2.3.2数据校验

此项目中有两种数据校验方式 1.hibernate-validated注解方式 在controller头上开启数据校验模式需要加入Validated 然后就可以 在参数前面加入任意的数据校验里的注解 例如;:NotNull() NotEmpty()等 面对字符串型的数据校验 参数前可以使用NotBlank()等 而面对对象/DTO实体的…

mongodb GUI工具(NoSQLBooster)

介绍 跨平台的MongoDB GUI工具&#xff0c;支持Windows、macOS和Linux。自带服务器监控工具、Visual Explain Plan、查询构建器、SQL查询等功能。提供免费版本&#xff0c;但功能相比付费版本有所限制。 免费版可供个人/商业使用&#xff0c;但功能有限。 安装成功后&#x…

让你的Mac电脑风扇工作起来,能够控制风扇的实用小工具

不知道你们有没有这个苦恼&#xff0c;Mac电脑明明自带散热风扇&#xff0c;但是很少工作&#xff0c;所以总是会有发热的问题&#xff0c;虽然电脑支架能够一定程度解决热量无法散出的问题&#xff0c;但是总归是不如风扇工作散热的效果好 那么如何让你的Mac风扇工作起来呢&a…

UE4 材质学习笔记08(雨滴流淌着色器/雨水涟漪着色器)

一.雨滴流淌着色器 法线贴图在红色通道和绿色通道上&#xff0c;那是法线的X轴和Y轴&#xff0c;在蓝色通道中 我有个用于雨滴流淌的蒙版&#xff0c;在Alpha通道中&#xff0c;有个时间偏移蒙版。这些贴图都是可以在PS上制作做来的&#xff0c;雨滴流淌图可以直接用笔刷画出来…

ModelMapper的常见用法 ,号称是beanUtils.copyProp....的升级版??,代码复制粘贴即可复现效果,so convenient

官网案例 以下将官网案例做一个解释 1&#xff09;快速入门 递归遍历源对象的属性拷贝给目标对象 拷贝对象下对象的属性值 Data class Order {private Customer customer;private Address billingAddress; }Data class Customer {private Name name; }Data class Name {pr…

ubuntu24 finalshell 无法连接ubuntu服务器, 客户端无法连接ubuntu, 无法远程连接ubuntu。

场景&#xff1a; 虚拟机新创建一个最小化的ubuntu服务器&#xff0c;使用finalshell连接服务&#xff0c;发现连接不上。 1. 查看防火墙ufw 是否开启&#xff0c;22端口是否放行 2. 查看是否安装openssh server, 并配置 我的问题是安装了openssh server 但是没有配置root可…

计算湘军,征程无限!麒麟信安受邀出席2024世界计算大会

2024世界计算大会 9月24日上午&#xff0c;以“智算万物 湘约未来——算出新质生产力”为主题的2024世界计算大会在长沙开幕。中共湖南省委书记沈晓明出席&#xff0c;中共湖南省委副书记、省人民政府省长毛伟明致欢迎辞&#xff0c;工业和信息化部党组成员谢远生出席并致辞&am…

fastdfs下的doc文件可以访问,但是图片无法访问报错404,解决记录

fastdfs下的doc文件可以访问,但是图片无法访问报错404 以下内容主要讲linux的问题 以下内容主要讲linux的问题 以下内容主要讲linux的问题 以下内容主要讲linux的问题 以下内容主要讲linux的问题 第1项:查看Nginx的日志 可以先去查看Nginx的日志,在你Nginx的安装目录下的lo…