Unity中的FixedUpdate、Update、LateUpdate的区别及游戏
帧更新
【基本了解】
三者执⾏顺序:FixedUpdate ——>Update ——>LateUpdate
三者作⽤:FixedUpdate固定帧更新,⼀般⽤作物理更新;Update⼀般⽤作游戏逻辑更新;LateUpdate⼀般⽤作相机更新
【深⼊了解】
帧率的概念
帧率是什么呢?⼀秒内画⾯更新的次数。游戏常⽤的有30fps,60fps。我们知道,帧率低游戏会卡顿,具体解释下就是,每秒内看到的画⾯更新次数变少,少于⼀个阈值,那么画⾯在⼈眼看来就是不连续的,也即卡顿的。
这是阈值是多少呢?⼈眼识别的帧率⼀般在24fps~30fps之间,不同⼈有所差别,也就是说只有在⼀秒内更新的次数(即帧率)⼤于这个值,在⼈眼看来画⾯才会是连续的。
Update的帧率
游戏帧率不是恒定的,Update函数的调⽤次数也不是恒定的。这意味着什么呢?以30fps为例,其表⽰每秒画⾯更新30次。
update是什么虽然有的游戏号称是30fps,但真的是每秒画⾯更新30次,⼀分钟更新30*60次,⼀⼩时更新30*60*60次吗?
肯定不是的,影响游戏帧率的因素有很多,也许在某⼀秒内画⾯更新了30次,在某⼀秒内只更新了25次。
暂且简单地认为画⾯更新次数和Update调⽤次数等同,虽然两者并不等同。
也即某⼀秒内Update的的调⽤次数可能是30次,也可能是25次。在程序执⾏中,⼀般是这个⽅法执⾏完了之后才去执⾏下⼀个⽅法,这也意味着,每次调⽤Update⽅法时,执⾏完Update的时间是不⼀样的。这有什么影响呢?
例如,想让物体每秒移动30⽶,如果你按照固定帧率来的话,可以计算出每帧(即1/30s)移动的距离为1⽶。然后在Update中更新物体的位移,写下代码A: transform.Translate(0, 0, 1)。这会发⽣什么呢?显然,可能会看到物体每秒移动的距离可能并不是30⽶,这是因为Update并不是每秒都调⽤30次。
(注意帧和秒的差别,从计算机的⾓度来看,是以帧来算画⾯的;从⼈的⾓度看,是以秒来算画⾯的)
所以,在Update中,我们常⽤.deltaTime,其表⽰完成上⼀帧所⽤时间(单位为秒)。写下代码B:transform.Translate(0, 0,
30*.deltaTime),则我们会看到每秒移动的距离基本上是30⽶。
仔细体会,你会发现,A实际上是将1s等分30份,每份时间都是1/30秒;B是将1s分为若⼲时间长度不同的多份,每份的Time.deltaTime 的值都不⼀样,Unity内部会更新这个值。
FixedUpdate
在FixedUpdate中,我们常⽤Time.fixeddeltaTime,这是⼀个固定的值,可以在Edit->ProjectSetting->time —>Fixedtimestep中设置。所以,FixedUpate每秒调⽤次数是⼀定的,但每帧调⽤的次数不是⼀定的,因游戏中每帧时间不⼀样。
Unity中默认fixeddeltaTime为0.02秒,但FixedUpdate并不是真的就0.02秒调⽤⼀次。因为在脚本的⽣命周期内,FixedUpdate处有⼀个⼩循环,这个循环也是通过物理时间累积看是不是⼤于0.02了,然后调⽤⼀次。有很多物体都进⾏物理更新,那么FixedUpdate的调⽤也会慢下来。
LateUpdate
LateUpdate在所有的Update执⾏完后再执⾏。例如,有两个脚本,X中有Update和LateUpdate,Y有Update,那么会执⾏完X和Y的Update后再执⾏X的LateUpdate。相机跟随⾓⾊时,⼀般是等⾓⾊移动好了,再把相机移动过去,否则相机移动过去了,⾓⾊还没过来,游戏画⾯中就看不到⾓⾊。
那么能不能把相机更新放在Update⽅法最后⾯再执⾏呢?不能
⼀是因为多个脚本的Update的执⾏顺序不确定,怎么能保证相机所在的Update⼀定是最后执⾏呢。如果相机所在的Update先执⾏了,那么就会导致有些物体(包括⾓⾊、怪物等)没能进⼊画⾯。
⼆是因为Unity将内部动画的逻辑更新放在了Update和LateUpdate之间,相机更新放在Update中,那么⾓⾊的动画状态还没更新。
游戏帧更新
上⽂说的帧是游戏画⾯更新算⼀帧a,⽽打开在Asset下新建的脚本会发现在Update前注释了“Update每帧b调⽤⼀次”。注意帧a和帧b不是⼀个意思,后者将Unity⼀个⽣命周期算作⼀帧。
显⽰器能⽀持的画⾯更新有⼀定限制,假设最⼤是50fps,即使在游戏中画⾯渲染可以达到60fps,那
么画⾯更新仍然是50fps。我们常说的游戏帧率指的是画⾯渲染的帧率,⽽游戏中⼀个渲染画⾯的形成可能是多个帧b的结果。
【参考】
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论