Unity--时间和帧率

Posted 鲨鱼辣椒说你很菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity--时间和帧率相关的知识,希望对你有一定的参考价值。

本文仅为个人学习笔记,总结和分享,难免存在瑕疵与言论不严谨,若有缺漏务必留言告知,文章将会第一时间修正,以免误导。


unity中如果不对代码进行优化,则Update函数中的代码会随帧数的增加而增加运行次数




public class RubyController : MonoBehaviour  
 // 每帧调用一次 Update    
// 让游戏对象每帧右移 0.1  
  void Update()   
         
        // 获取水平输入,按向左,会获得 -1.0 f ; 按向右,会获得 1.0 f
        //input类管理用户输入
        //GetAxis是获取轴
        //Horizontal水平相关操作,向左则会 -1.0 f,向右+1.0f   
   float horizontal = Input.GetAxis("Horizontal");      
        // 获取垂直输入,按向下,会获得 -1.0 f ; 按向上,会获得 1.0 f
        //Vertical向上向下不同     
   float vertical = Input.GetAxis("Vertical");        
        // 获取对象当前位置
        //Vector是unity自带类    
        //创建一个Vector2类的position对象,并且用transform类表示该对象的坐标值,存入position对象     
   Vector2 position = transform.position;       
        // 更改位置
        //把positon对象的x值+0.1,并且存入      
  position.x = position.x + 0.1f * horizontal;      
  position.y = position.y + 0.1f * vertical;        
        // 新位置给游戏对象
        // 将更改后的坐标存入原始坐标达到更改    
 transform.position = position;   
 
如上代码,如果游戏以每秒60帧的速度运行,那么角色将会每秒移动60*0.1。如果每秒10帧,那么将会每秒移动10*0.1。 即Position.x(新的x轴位置)=原有x轴位置+速度0.1f*帧数(60帧则为*60) 这会导致不同机器,不同情况下运行同一游戏速度不一致的问题, 使游戏的难易程度提高或降低 但也并非所有情况均会导致游戏变糟, 《生化危机2:重制版》中利用每一帧判定一次伤害做到了近战武器攻击敌人,玩家可以通过增加武器停留在敌对目标体内的时间来达到打出更高伤害(模拟了现实生活中,小刀攻击敌人并非是每次攻击才能打出伤害,而是通过停留在敌人体内时间越长伤害越高),但此法仅适用于帧数锁定的主机端,帧数如果不锁定则可能出现每次攻击伤害忽高忽低。
解法1:锁帧 并不推荐
public class RubyController : MonoBehaviour   
 // 在第一次帧用之前调用Start函数   
 void Start()   
        
 // 只有将垂直同步计数设置为0,才能锁帧,否则锁帧的代码无效    
    // 垂直同步的作用就是显著减少游戏画面撕裂、跳帧,因为画面的渲染不是整个画面一同渲染的,而是逐行或逐列渲染的,能够让FPS保持与显示屏的刷新率相同。     
   QualitySettings.vSyncCount = 0;     
   //设定应用程序帧数为10    
    Application.targetFrameRate = 10;  
     
 // 每帧调用一次 Update  
  void Update()   
       
  float horizontal = Input.GetAxis("Horizontal");     
   float vertical = Input.GetAxis("Vertical");      
  Vector2 position = transform.position;      
  position.x = position.x + 0.1f * horizontal;       
 position.y = position.y + 0.1f * vertical;      
  transform.position = position;   
 
锁帧反而会导致强力的设备运行效果不满意,同时垂直同步的开启会让射击类游戏存在严重画面延迟
解法2:以单位/秒表示移动速度,而不是单位/帧(默认为此)表示
public class RubyController : MonoBehaviour    
// 定义一个公有float形对象,speed表示主角移动速度,使其可直接再unity中修改而不用手动调整    
public float speed=0.1f;
// 每帧调用一次
 Update   void Update()   
      
 float horizontal = Input.GetAxis("Horizontal");    
   float vertical = Input.GetAxis("Vertical");    
   Vector2 position = transform.position;      
 position.x = position.x + speed * horizontal * Time.deltaTime;     
  position.y = position.y + speed * vertical * Time.deltaTime;      
 transform.position = position;  
 
Time.deltaTime--增量时间 增量时间随着每秒帧数变化而随之变化 1秒30帧,那增量时间就是 1/30 秒 1秒60帧,那增量时间就是 1/60 秒 1秒166帧,那增量时间就是 1/166 秒 这样,速度*时间增量就会让每秒移动量不因帧数的改变而变得忽高忽低,而是帧数高则移速低,帧数低移速高
Update函数是每帧执行一次,那么每过一帧耗费的时间就是 增量时间 1秒内Update执行的次数,就是1秒内执行的总帧数
参考资料: B站up主chutianbo的gitee文档 GameDesign/Unity/官方教程项目系列/官方教程05_2D游戏/RubyAdventure/01-Ruby冒险2D初学者教程.md · chutianshu/xyz-s-free-course-for-full-stack-web-dev - Gitee.com时间和帧率部分 unity官方文档:时间增量:Unity - Scripting API: Time.deltaTime (unity3d.com) 垂直同步:Unity - Scripting API: QualitySettings.vSyncCount (unity3d.com) 知乎文章《FPS影响小刀攻击力?《生化危机2:重制版》那些好玩的事FPS影响小刀攻击力?《生化危机2:重制版》那些好玩的事 - 知乎 (zhihu.com) 百度百科:垂直同步 垂直同步_百度百科 (baidu.com) CSDN: Unity增量时间Time.deltaTime详解 (101条消息) Unity增量时间Time.deltaTime详解_Chinarcsdn的博客-CSDN博客_deltatime

Sensor曝光和帧率基础知识

Sensor曝光和帧率基础知识

1. 简介

  • Sensor曝光方式
    • 逐行曝光:价格便宜,适合拍摄非快速运动场景
    • 全局曝光:价格昂贵,适合拍摄快速运动场景

2. H_BLANK和V_BLANK

  • H_BLANK(水平消隐或行消隐): 在将光信号转换为电信号的扫描过程中,扫描总是从图像的左上角开始,水平向前行进,同时扫描点也以较慢的速率向下移动。当扫描点到达图像右侧边缘时,扫描点快速返回左侧,重新开始在第1行的起点下面进行第2行扫描,行与行之间的返回过程称为水平消隐(也叫行消隐,H_BLANK)。一幅完整的图像扫描信号,是由水平消隐间隔分开的行信号序列构成,称为一帧
  • V_BLANK(垂直消隐或场消隐):扫描点扫描完一帧后,要从图像的右下角返回到图像的左上角,开始新一帧的扫描,会有一段间隔时间,这一时间间隔,叫做垂直消隐(也称场消隐,V_BLANK),V_BLANK的作用通常用来调节帧率
  • 帧结构示意图

3. 曝光原理

3.1 Sensor逐行曝光基本原理

  • sensor逐行曝光从第一行开始曝光,一个行周期结束之后第二行才开始曝光。依次类推,经过N-1 行后第N 行开始曝光。第一行曝光结束后开始读出数据,读出一行需要一行周期时间(含行消隐时间,即H_Blank)。至第一行完全读出后,第二行刚好开始读出,依次类推,当第N-1 行读完后,第N 行开始读出,直到整幅图像完全读出。

3.2 Sensor全局曝光基本原理

  • 全局曝光Sensor的所有行同时开始曝光,并同时结束曝光,在曝光结束后,Sensor将所有电子从感光区转到存储区,之后逐行地读出像素数据。 这样曝光的好处是获得图像每一行的曝光时间比较一致,并且在拍摄运动物体时图像不会出现偏移和歪斜。

4. 曝光时间计算公式

4.1 曝光一行的时间 l i n e _ t i m e line\\_time line_time

  • 曝光一行的时间等于一行的长度乘以曝光一个像素需要的时间
    l i n e _ t i m e = l i n e _ l e n g t h / p c l k line\\_time = line\\_length / pclk line_time=line_length/pclk
    • line_length: 一行的长度(包含h_blank)
    • pclk: 是控制像素输出的时钟,即pixel采样时钟,单位MHz。表示是每个单位时间内采样的pixel数量
    • line_time: 曝光一行的时间

4.2 曝光一帧的时间 e x p o s u r e _ t i m e exposure\\_time exposure_time

  • 曝光一帧的时间等曝光的行数乘以曝光一行的时间
    e x p o s u r e _ t i m e = e x p o s u r e _ l i n e × l i n e _ t i m e exposure\\_time = exposure\\_line \\times line\\_time exposure_time=exposure_line×line_time
    • exposure_time: 曝光时间。指曝光一帧需要多长时间
    • exposure_line: 曝光行。指这一帧曝光了多少行
    • line_time: 曝光一行的时间

4.3 帧率(fps)的计算

以上是关于Unity--时间和帧率的主要内容,如果未能解决你的问题,请参考以下文章

unity引擎中游戏物体的生命周期

100个 Unity实用技能| Unity中设置 允许的最大帧数,锁定游戏的最大帧率(游戏锁帧)

100个 Unity实用技能☀️ | Unity中设置 允许的最大帧数,锁定游戏的最大帧率(游戏锁帧)

100个 Unity小知识点☀️ | Unity中显示运行时游戏帧率的方法

unity小地图掉帧严重

Unity3DUnity 游戏画面帧更新 ( 游戏帧相关概念 | MonoBehaviour#Update() 帧更新方法 | 帧更新时间统计 | 设置游戏更新帧率 )