Unity:帧 timeScale Update 生命周期 Update优化(干货集合) | 您所在的位置:网站首页 › unity帧率与速度 › Unity:帧 timeScale Update 生命周期 Update优化(干货集合) |
本文内的大致机制是个人凭借理解的经验之谈,也就是说如果我来写这个功能应该怎么写,不一定对,借鉴一下就行 文章目录 帧Application.targetFrameRate (fps)Time.frameCount 游戏时间Time.timeScaleTime.deltaTimeTime.timeTime.realtimeSinceStartup UpdateUpdateLateUpdateFixedUpdate 生命周期GameObject首次Active=true时Active=true时每帧调用非首次Active=trueActive=false脚本被删除或者绑定的游戏对象被销毁 各个Update执行的顺序协程减少Update内容执行的次数 帧 Application.targetFrameRate (fps)游戏实际的fps由Application.targetFrameRate决定,这个字段是可以自己设置的。设置好之后,游戏便会按照这个速率进行逐帧播放。 无论Time.timeScale是多少都不会影响帧播放的速度。 当然,不是每两帧之间的时间间隔都是一样的,所以才会存在Time.deltaTime。 Time.frameCount这个参数存的是游戏开始到现在为止的总帧数。 游戏时间 Time.timeScaleTime.time的增长的速率倍数 Time.deltaTime距离上一帧的时间差,受Time.timeScale影响。 大致机制: realDeltaTime*Time.timeScale。 Time.time游戏开始到现在的时间(秒),受Time.timeScale影响。 大致机制: 每一帧增长Time.deltaTime。 Time.realtimeSinceStartup游戏开始到现在的时间(秒),不受Time.timeScale影响。 大致机制: 当前时间减去游戏开始时间 Update Update每帧都会调用,由于帧不受Time.timeScale影响,所以Update调用的速率也不受Time.timeScale影响。 如果需要受Time.timeScale影响,最简单的便是在Update内使用Time.deltaTime。 LateUpdate这个函数也是每一帧调用,但是是等所有Update执行完毕后再执行。 FixedUpdate固定时间调用,例如每0.02秒执行一次。 内部应该是根据Time.time来执行的,所以受Time.timeScale影响。 大致机制: 如果Time.time大于某时刻,执行,并刷新时刻到下一个时刻。 调用的时间间隔可以在项目设置内修改:
参考我的这篇博文https://jkchen.blog.csdn.net/article/details/110791595 其中与帧相关的或者WaitForSeconds是受Time.timeScale影响的。 WaitForSecondsRealtime则不受Time.timeScale影响。 减少Update内容执行的次数比方说我需要检测鼠标下的对象,但是fps=30的时候难到一秒钟可以变化30次? 这种情况下我们可能只需要每0.5秒执行一次就可以了,所以在Update内加入 逻辑: 我的游戏Time.timeScale只有0和1两种情况,当Time.timeScale==1时维护realFrame=realFrame+1,这样就可以使帧数受Time.timeScale影响了。 然后计算出second时间内的运行帧数frame ,当realFrame%frame ==0时返回true。 void Update(){ if (Helper.DealInterval(.2f)) { } }Helper: /// /// 每隔second秒时间执行1次(大致意思、不精确):返回true /// 需要精确的需要用协程 /// /// /// public static bool DealInterval(float second) { int frame = Mathf.RoundToInt(Application.targetFrameRate * second); if (frame realFrame++; } } |
CopyRight 2018-2019 实验室设备网 版权所有 |