UE4-DeltaTime(时间增量)

2023-11-16

  • UE4-DeltaTime(时间增量)
  • Time: 2020年10月14日13:33:52
  • Author: Yblackd


1. 结论

  • Update(Unity) \ Tick(UE4)执行了1次,transform.Translate(0, 0, 1/60 \* 10)执行一次,物体移动了1/6米
  • Update1秒内执行了60次,就是transform.Translate(0, 0, Time.deltaTime \* 10)乘以60次相当于 =(每帧时间1/60 * 速度 * 60)=10米
  • Update1秒内执行了N次,就是transform.Translate(0, 0, Time.deltaTime \* 10)乘以N次相当于 =(每帧时间1/N * 速度 * N)=10米

2. deltaTime - 增量时间

​ 让一个物体,每秒移动10米,代码如下

  • Unity

        /// <summary>
        /// 每帧刷新
        /// </summary>
        void Update()
        {
            transform.Translate(0, 0, Time.deltaTime * 10); //物体沿着自身Z轴方向,每秒移动物体10米运动
        }
    
  • UE4

    {
    	Super::Tick(DeltaTime);
    	FVector NewLocation = GetActorLocation(); // 获取Actor当前位置向量
    	float DeltaHeight = FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime); // 计算正弦增量
    	NewLocation.Z += DeltaHeight * 20.0f;  // Actor位置向量Z轴 加 增量*基数  (个人暂时这么理解,有大佬理解,本人虚心接受教学)
    	RunningTime += DeltaTime;  // 记录游戏运行时间
    	SetActorLocation(NewLocation);  // 更新Actor位置向量Z轴值
        // 调试查看 DeltaTime 和 RunningTime 值
        UE_LOG(LogTemp, Warning, TEXT("DeltaTime: %f"), DeltaTime);
    	UE_LOG(LogTemp, Warning, TEXT("RunningTime: %f"), RunningTime);
    }
    
    /*
    	控制角色的移动(具体高度),以便随时间推移通过正弦波控制移动量。 也就是说,在时间0,它开始向上移动相对较快,然后放慢向上移动,直到它停止向上移动,然后开始向下移动,向下加速,最终减速并再次向上移动。 它继续周期性地以这种方式上下移动。  
    	所以,这个函数的工作原理是,它被周期性地调用,然后这个调用和最后一个时间之间的时间变化是DeltaTime。 最后一次被称为RunningTime。 所以计算一下新的位置:  
    */
    

3. 为什么乘以 时间增量

我们假设游戏运行时,1秒是60帧。—— 那就是说60个画面,刷!刷!刷!执行完,耗时1秒。(思考:打游戏时FPS值是什么?)


如果电脑,或者手机帧数没有到60帧,时而30帧,时而50帧

那么就会出现,有时候1秒移动了500米 有时候300米,总之每秒都不一样


所以牛逼的前辈们就想到了解决办法,从而引入了增量时间的概念

增量时间是实时变动的,而且每一帧都在变动

1秒30帧,那增量时间就是 1/30 秒
1秒60帧,那增量时间就是 1/60 秒
1秒166帧,那增量时间就是 1/166 秒

这样的设计理念,就保证了无论帧率是多是少,我们让物体1秒移动10米,最后1秒移动的就一定是10米


公式:路程=速度*时间


10米=1秒 * 10米/秒
10米=(1/60 * 60) *10米/秒
10米=(1/166 * 166) *10米/秒
10米=(增量时间 * 1秒总帧数) *10米/秒

重点:

Update函数是每帧执行一次,那么经历过一帧耗费的时间就是 增量时间/deltaTime

1秒内Update执行的次数,就是1秒内执行的总帧数

所以我们只需要写上 transform.Translate(0, 0, Time.deltaTime \* 10)这一个函数

Update执行了1次,transform.Translate(0, 0, 1/60 \* 10)执行一次,物体移动了1/6米

Update1秒内执行了60次,就是transform.Translate(0, 0, Time.deltaTime \* 10)乘以60次
相当于 =(每帧时间1/60 * 速度 * 60)=10米

Update1秒内执行了N次,就是transform.Translate(0, 0, Time.deltaTime \* 10)乘以N次
相当于 =(每帧时间1/N * 速度 * N)=10米

4. 注意误区

而大家都知道 Update 函数的调用,是很快的。在我们假定的情况下,这1秒就会被调用60次

而此时我们的代码transform.Translate(0, 0, 10)被执行60次

每执行一次,物体就会移动10米。60*10=600米,这完全违背了我们让物体每秒移动10米的初衷

公式:路程=速度*时间

Update执行了1次,transform.Translate(0, 0, 10)执行一次,物体就已经移动了10米

Update1秒内执行了60次,就是transform.Translate(0, 0,10)乘以60次
相当于 =(10 * 60)=600米

Update1秒内执行了N次,就是transform.Translate(0, 0, 10)乘以N次
相当于 =(10 * N)=10N米

5. 参考

参考链接:https://blog.csdn.net/ChinarCSDN/article/details/82914420

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4-DeltaTime(时间增量) 的相关文章

  • SL4 AutoCompleteBox 重复筛选结果问题

    我在 AutoCompleteBox 过滤方面遇到问题 它似乎记住了之前的过滤器 例如 我输入 A 它会返回 1 项 我删除 A 并输入 Z 这应该返回 1 项 问题是它返回 A 过滤器加上 Z 的结果 我删除 Z 并输入 S 这会带回 2
  • 必须打开存储才能执行此操作 - System.IO.Packaging.Package

    我正在使用 System IO Packaing Package 类来压缩文件 我的应用程序的多个实例可以同时运行 并读取和保存文件 当处理小文件时 一切似乎都很好 但是当涉及大文件时 如果应用程序的两个实例同时保存 我会收到一个异常 消息
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐

  • Opencv.js+Hbuilder快速打造一个图像处理App

    一 开发工具简介 1 Opencv js Opencv 是一个常见的图像处理库 通常使用C 和python去调这个库对图像 视频流进行处理 而js版的opencv可以进一步丰富前端对于图像的处理 目前opencv js版映入了与其他版本基本
  • 安信实验室教你如何实现Windows自动安装!

    用户接入硬件后 Windows 自动下载安装或更新厂商的驱动软件 特点 1 产品的驱动程序及软件已放入微软官方驱动程序库 全世界用户都可以很快捷和方便地自动安装厂商自定义的软件 驱动通过微软官方认证 最佳安全性保障和信用背书 应用软件可以自
  • adb shell dumpsys activity activities调用信息简析

    活动栈 通过执行上面命令 可以得到类似如下格式的信息 Stack 45 type standard mode fullscreen isSleeping false mBounds Rect 0 0 0 0 Stack 0 type hom
  • Python 重命名文件或目录(os.rename)

    文章目录 1 概述 2 语法 os rename 2 1 相对路径 2 2 绝对路径 3 扩展 3 1 os 模块详解 1 概述 mermaid svg 9u1Lg7aqBXqPfILR label font family trebuche
  • Python面试常见的30个问题及答案

    Python面试问题 问题1 Python的主要功能是什么 python特性如下 解释型 动态类型 面向对象 简洁明了 免费自由 有一个庞大的社区 Q 2 区分深层和浅层拷贝 深拷贝将对象复制到另一个对象中 这意味着如果您对对象的副本进行更
  • vue-resource的$http.jsonp方法例子

    div class box div
  • svn版本回退

    SVN版本回退 当一不小心把文件改错了或者误删除了文件并提交到了服务器 我们要取消这些修改的话 首先就是将这个文件还原到上一个修订的版本的内容 revert to this rebision 然后将这个文件重新提交 那么服务器上的这个文件就
  • 集成开发工具使用

    集成开发工具使用 Intellij IDEA介绍 下载 安装 IDEA开发Java项目 IDEA快捷键 IDEA常见配置和操作的学习 1 IDEA 1 1 IDEA概述 IDEA全称Intellij IDEA 是用于Java语言开发的集成环
  • Windows Server 2016-OU组织单位日常操作

    技术无所谓贵贱 既然曾经做过就总该是要留下点什么 毕竟做技术这些年给我们留下太多太多的成长经历 总有人问这些已经很皮毛了为什么还要写 其实没那么多花哨理由 就是想着做或者不做这一块总是要对过往做个简单归总 习惯已成自然 虽然因为种种原因频繁
  • 使用http动词篡改的认证旁路

    文章目录 一 漏洞描述 二 解决建议 三 解决方法 Springboot 配置文件增加配置 编写配置类 编写过滤器 提示 以下是本篇文章正文内容 下面案例可供参考 一 漏洞描述 可能会升级用户特权并通过 Web 应用程序获取管理许可权可能会
  • C++小坑:问号表达式的输出

    文章目录 发现问题 解决方案 发现问题 本来只是想写这样一个测试是否连接成功的判断 std cout lt lt Result gt lt lt Avaliable hey you got it hell suck it lt lt std
  • DSView源码阅读笔记(持续更新中···)

    一 DSView源码阅读笔记 主线任务 将源码成功编译运行 提取示波器功能代码 添加示波器通道数量 找到接收数据部分源码 在win平台上使用qt开发环境进行代码重构 支线任务 以下笔记内容部分是猜测内容 DSView pv mainwind
  • RMS正则化 和 STD正则化 的一些见解

    研究styleganv2过程中 记录下它使用的正则化方法的一些见解 RMS 方均根 STD 标准差 stylegan 中的 pixel norm 是 RMS正则化 常见的BN层 IN层 用的是STD 在不减均值的情况下 RMS正则化公式 t
  • 针对于QT5下找不到QApplication头文件的问题界解决

    感谢前辈的总结 这里用了CTRL C CTRL V进行操作 原地址 http bbs csdn net topics 380130389 老版本 C C code 1 2 include
  • 【计算机网络】数据通信的基础知识

    通信系统的一般模型 数据通信系统的组成部分 源点 信源 产生数据 如从键盘输入 产生数字比特流 发送器 对数字比特流进行编码 如调制器 信道 是信号传输的通道 可能是一条简易的传输线路 也可能是一个复杂的网络 接收器 设备的功能与发送设备相
  • 保姆式教学-实现天空盒旋转

    目录 一 天空盒材质设置 1 在菜单栏window gt Rendering gt lighting 2 设置天空盒子材质 替换默认材质 3 认识Rotation变量 二 代码实现让天空盒转起来 在一个小Unity项目中 需要将天空盒旋转
  • 将MATLAB环境下深度学习目标检测模型部署在Jetson TX2开发板

    摘要 在MATLAB2019b环境下训练深度学习目标检测模型 利用MATLABcoder和GPUcoder生成c 代码和CUDA代码 并部署在NVIDIA Jetson TX2开发板上运行 1 利用NVIDIA SDK manager对TX
  • Python的heapq堆模块

    heapq模块 一 heapq内置模块 二 heapq 模块的使用 1 创建堆方法 2 访问堆的方法 2 获取堆的最大值 最小值方法 总结 一 heapq内置模块 Python中的heapq模块提供了一种堆队列heapq类型 这样实现堆排序
  • Java线程与操作系统线程的关系

    操作系统的线程 Linux操作系统启动一个线程 int pthread create pthread t thread const pthread attr t attr void start routine void void arg 再
  • UE4-DeltaTime(时间增量)

    UE4 DeltaTime 时间增量 Time 2020年10月14日13 33 52 Author Yblackd UE4 DeltaTime 1 结论 2 deltaTime 增量时间 3 为什么乘以 时间增量 4 注意误区 5 参考