对Unity的Update和FixedUpdate的进一步个人理解

Unity在执行游戏逻辑的时候
在一个场景中有多个挂载着脚本的游戏物体的时候
脚本的执行顺序并不是并行执行的
执行顺序相当于
操作系统的调度的那种的,类似的
反正我会在这一帧的时间内执行完这个场景中所有Enable物体上的Update函数

FixedUpdate函数()
刚体物理相关的计算,一般扔到这个里面
每秒根据你所定的每一帧的执行时间来计算
你要定义是每帧执行时间为0.02秒,那你用1/0.02那就是每秒执行50次
物理计算不应该扔到Update函数内,因为物理计算较为复杂,且消耗性能,
所以放在Update函数的话,每秒进行如此高速的运算,
会使我们的机器CPU负担及大
而且你放Update里面的话,update受系统性能的影响,每秒的帧数是不一样的
你好比我要让一个Cube从A点走到B点,A点和B点距离6m,然后是每帧走0.1m
具体代码就是 transform.Translate(this.transform.forward*0.1f);
你机子性能好的时候,可能1秒60帧,那1秒就是走6m,刚好到B点
那你要是帧率到120呢?一秒内你就走了12m
那你要是帧率30呢?同样的一秒你只走了3m
而且多好的机子你也没法保证时刻都稳定在一个帧率

具体看这段代码
         float i = 10f;

        private void Update()
        {
            if (i > 0)
            {
                transform.Translate(this.transform.forward);
                 i -= Time.deltaTime;
            }
        }


我第一次运行的时候这个Cube只跑了598m
                     第二次为595m
                      第三次为597m
                        第四次599m

这几次我的帧率都是在57.8到60.35之间跳动的
这个时候就体现出Update再进行刚体计算的时候体现出的不可靠,
你把这个代码放FixedUpdate里去,你就发现每次运动的距离都一样

而且你把这段代码分别放到FixedUpdate和Update中去运行,你会发现,
放在FixedUpdate里面运行的Cube移动的,没有Update里的顺滑,
当然你那个TimeStep那是保持默认的情况下,还有你机子配置得够,你别运行Unity就很卡那样的。

你设计游戏的时候,就要想到,玩家的机子虽然有好坏之分,
但是但凡能玩的你要保证玩家的体验一样啊,
不能你拿个IphoneX你1秒飙6m,我拿个千元机就只能1秒走3米啊
你拿IphoneX只能说是你每秒跑的帧数多,但是我设定你的FixedUpdate每秒运行50次
transform.Translate(this.transform.forward * 0.1f);把这个放fixedUpdate里
那无论好手机,还是坏手机,每秒移动的次数都只能是5m

而Update函数的执行次数是根据你机器的硬件水平来看的
你机器好,Update在1秒内执行的次数也就越多,画面看起来也就越平滑

但是这个FixedUpdate和Update是由不同的定时器控制的
就好像这俩不是用的同一个表来计时的
FixedUpdate在Update函数之前每帧在执行
我FixedUpdate()就按着我自己的那个表来看,(按上面说的那个时间来啊),
我不管你这机器多叼,或者多垃圾
我就看着我那个表,心里有B数
我就一秒内执行50次,你Update每秒执行的再快
我每秒该运行几次还运行几次

所有就是说当Update函数在执行了多次的时候,
FixedUpdate()可能才执行了一次,
所以说Update里拿到的物理计算的结果,
可能是Update函数已经运行了好几帧之后的那个值
换句话就是说我这运行的这几帧所用到的物理计算的结果
用到的值可能都是相同的。直到下一次FixedUpdate函数执行
你Update里才能拿到我最新的值
当然这是在你机器运行速度正常,或者稍快些的时候
还有一种情况是当你电脑垃圾的时候,你Update执行的慢了是什么样呢?
就反过来了,你FixedUpdate执行的快了,一帧好几次
我update()一帧运行一次,你运行的再快我也就是拿你最后的值

所以就是说后面的渲染部分拿到的数据,也是拿到的最后的值,

还拿移动来举例,我后面渲染拿到的值越密集,画面也就越多,
人眼看到的也就越流畅,反过来就是,
transform.Translate(this.transform.forward * Time.fixedDeltaTime);
当我fixedupdate执行多次的时候,算出越来越多的结果的时候
你渲染的时候只拿我最后的那个坐标,
你一开始的坐标是(0,0,0)
我在你按下按键就开始结算,
(0,0,0.1)
(0,0,0.2)
(0,0,0.3)
(0,0,0.4)
(0,0,0.5)
    。
    。
    。
比方说我算了5次,正常来说,就是说你机器配置够,性能足够强的时候,
渲染的时候就是这五次坐标的变换都能拿到,
在Game视窗就是。。。嗯。。。拿那种手绘的翻页动画来举例吧,
从z轴=0(因为是forword嘛)开始,你机器配置够,性能足够强的时候,就相当于你在那个画本上画了五张Cube不断移动的画面
这样你开始掰着那话本开始忽悠忽悠的播放的时候,你在一秒内看到的就是5张画面
相反,你机器很垃圾
你再播放你画本的时候,从z轴=0开始,你就只能看到一张,你的视角就是这个Cube直接从0闪现到了0,0,0.5那个位置
这样就是我们说的帧数低。

但是为啥用俩表计算时间的函数却有执行次序之分呢?
我们需要知道FixedUpdate和Update是运行在同一个线程上的
你平时FixedUpdate函数工作完了,休息了
我Update就继续赶工,
你休息的时候,我就拿着你工作完的结果继续工作,
当咱们(注意这里用到了咱们)我就在后面等着你当前工作完,
我拿到你计算的新的结果了,如果我需要你这个结果的话
我再拿着这个结果去更新我的下一次也就是当前即将进行的这次工作。

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Unity中的UpdateFixedUpdate都是用于控制游戏对象更新的函数。 Update函数在每一帧中被调用,可以用于实现游戏对象的运动、动画、输入响应等逻辑。但由于Unity的渲染和物理计算是分开进行的,所以使用Update函数来控制物体的运动会受到帧率的影响,导致不同设备上的表现不一致。 FixedUpdate函数则是在固定的时间间隔内被调用,通常用于处理物理计算。因为固定时间间隔内物理计算的结果是可预测的,所以使用FixedUpdate可以避免因帧率不稳定而导致的物理运动不一致的问题。 因此,在使用UpdateFixedUpdate时需要根据具体的情况进行选择,一般来说,如果需要处理物理计算,就应该使用FixedUpdate,否则就可以使用Update。 ### 回答2: Unityupdatefixedupdate都是用来更新游戏对象的功能函数。它们的区别主要在于调用时间和调用方式。 update函数是每一帧都会被调用的函数,可以在其中添加任何需要每一帧都要执行的操作,比如玩家角色的移动、攻击、动画等等。由于其调用时间是每一帧都会被调用,因此执行时间可能会根据不同的设备有所不同,而且可能会出现卡顿等情况。因此,update函数适用于更新与时间无关的游戏逻辑和显示元素。 fixedupdate函数是固定时间调用的函数。它的调用时间是由时间间隔来指定的,通常默认为0.02秒,可以在Project Setting中调整。fixedupdate函数适用于存在物理效果的操作。比如,角色的跳跃、受力反应等。这是因为物理引擎有其单独的计算时间,如果物理计算和游戏更新时间不同步,会产生各种不同的结果。因此,fixedupdate函数保证每个固定时间间隔内进行物理运算并对对象进行应用,确保物理效果的准确性。 总之,Unityupdatefixedupdate函数都有它们各自的用途和适用场景。在编写游戏逻辑时,应该根据需要使用不同的函数来实现最佳效果。为了改善游戏的性能和使游戏更加稳定,也应该尽可能避免使用过多的update函数,避免频繁的更新和渲染操作。 ### 回答3: Unity 中的 UpdateFixedUpdate 是两个重要的函数,用于控制游戏对象的更新。两个函数具有相似之处,但也有很大的不同。 Update 函数是在每一帧上调用的。它的调用时间随着帧速率的增加而变得更加频繁,因此它可以用于实现游戏对象的动画,输入检测,物体位置跟踪等。Update 函数可以应用于绝大多数情况,通常它被用于增加物体的移动速度并更新物体的位置。 然而,当开发者需要控制刚体物体的时候,建议使用 FixedUpdate 函数。 FixedUpdate 函数是在每一个固定时间间隔内调用。这个时间间隔由物理引擎所设定的帧率所决定。物理引擎是 Rigidbody 组件的核心,可以控制物体的运动行为。这个时间间隔在不同平台上是更加稳定的,所以适用于模拟物理运动。例如,要实现一个跳跃的物体,可以在 FixedUpdate 函数里添加一个力,来模拟物理场景下的跳跃。 UpdateFixedUpdate 函数的最大区别在于它们所运作的时间。在 Update 函数中,时间始终是变化的,但是 FixedUpdate 函数运行的间隔是固定的,这使得它是一个非常有用的函数。这两个函数可以结合使用来创建一个更好的游戏对象。然而,开发者必须要确定为何使用哪个函数,以确保游戏对象能够正确实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值