一:前言
例如一个RPG游戏,主角的移动通过在Update中用速度乘以时间差Time.deltaTime模拟,当某帧卡顿了很久,Time.deltaTime将会变得很大,导致下一帧主角会无视地图障碍直接瞬移到一个很远的距离导致穿模,超出地图等bug,而在FixedUpdate中会避免此问题,下面就针对Update与FixedUpdate深入研究一下
二:区别
Unity的物理系统是通过FixedUpdate来执行的
——执行顺序
Update在FixedUpdate之后执行。例如有两个脚本A和B,A中有Update和FixedUpdate,B中有FixedUpdate,A中有Update会在A和B的FixedUpdate都执行后再执行
——执行时机
Update是每帧执行(每次渲染新的一帧的时候),与设备的性能和Update中逻辑的复杂程度有关,使用Time.deltaTime可以获取到与上一帧的时间差,Unity限定最大值为0.333秒
FixedUpdate也是每帧执行,但是它帧率固定(由Time设置中的Fixed Timestep参数决定 )
三:重点
一个逻辑帧(一次Update算一个逻辑帧)中可能会执行多次FixedUpdate,Fixed Timestep默认设置为0.02s,则一秒会准确执行50次FixedUpdate,而Update的执行次数会根据设备的帧率影响
例如Update中有很复杂的逻辑运算,当某帧卡顿了很久后,Update执行了一次,而FixedUpdate会执行很多次,