从帧概念到动态模糊


什么是帧

帧(Frame)可以理解为,在某个时刻的一个画面。
动画(纯粹字面上的意思,不限于二次元),就是在一定速率下,将不同时刻的画面,进行计算机的屏幕刷新的结果。

帧动画的每帧图片 组合成帧动画: 帧动画

帧与帧之间发生了什么

对于视频流来说,如何实现让画面动起来的效果呢?

就以游戏来说,每一帧所呈现的画面,都与当前帧绘制之前的逻辑处理有关。
而处理内容主要有:

  • 根据当前帧玩家的输入或其他操作事件,对游戏物体进行生成、销毁、空间或仿射变换;
  • 实际运行中,每帧之间的时间间隔不固定,因而需要根据实际跟上一帧的时间间隔,来进行仿射变换或其他数据处理;
  • 当处理好游戏的数据之后,游戏引擎以及计算机图形接口,会将游戏数据对应的渲染信息(对于3D场景,会将各个物体顶点的三维坐标,进行投影,转换成屏幕坐标),绘制到屏幕而形成一个画面(即帧)。

Unity的Update函数示例 如下所示,该脚本在每一帧(Unity每帧调用一次Update函数)中,检测游戏物体是否超出屏幕,如果超出则销毁该游戏体。

using UnityEngine;

public class TestBhv : MonoBehaviour {
    // Update is called once per frame
    void Update() {
        if (isOutboundary()) {
            Destroy(this.gameObject); // 如果超出边界,则销毁游戏体
        }
    }
    // 检测是否超出边界
    bool isOutboundary() {
        Vector2 pos = Camera.main.WorldToScreenPoint(this.transform.position);
        if (pos.x <= 0 || pos.x >= Screen.width || pos.y <= 0 || pos.y >= Screen.height) {
            return true;
        }
        return false;
    }
}

动画与帧的关系

动画一般是跟时间绑定的,而在实际的游戏开发逻辑中,时间却是以帧进行划分的。

就以一个简单的平移动画来说,要如何在3秒内,将一个游戏体O从A点移动到B点?

一般地,我们很容易想到的就是,启一个时间间隔为0.1秒(也可以是其他值)的定时器,然后在定时器回调中,将游戏体O移动(0.1*AB/3)的距离。

然而,这种做法是不准确的,更为严谨的移动方式(以下方式,假定定时器执行回调时,不自带实际所花时间间隔的参数,对于一些游戏引擎,定时器回调函数中是会自带该参数的)是:

  • 首先在启动定时器时,记录当前时间戳;
  • 然后在定时器回调中,根据当前时间和之前记录的时间戳,获得实际的时间间隔,然后根据该值换算出距离,进行平移,同时重置所记录的时间戳为当前时间。

注:这里的定时器,必须确保不能阻塞住当前进程,否则会出现画面卡住的现象。

对于Unity来说,不用创建额外的定时器,可以直接给游戏体O绑定一个脚本,在脚本的Update函数中,根据当前与上一帧的时间间隔进行移动即可。

using UnityEngine;

public class TestBhv : MonoBehaviour {
    public float m_velocity = 1;
    // Update is called once per frame
    void Update() {
        // 每帧向y轴移动m_velocity*Time.deltaTime距离,其中的Time.deltaTime为距离上一帧的时间间隔
        this.transform.Translate(0, m_velocity * Time.deltaTime, 0);
    }
}

帧率的定义

帧率(FPS,Frames Per Second)是指,每秒所运行的帧数。
大部分的电影,是将已生成好的图片,根据一定帧率(24FPS)进行播放,从而形成连贯的画面。
而在3D游戏中,一般是实时生成当前时刻的画面,按照30、60或更高的帧率进行屏幕刷新。

也许你会有疑问,为什么在玩游戏时,低帧率情况下会遇到画面不连贯的情况,而在观看电影时,却很顺畅呢?

答案就是,动态模糊技术。

对于电影的画面来说,由于是用镜头拍摄的,而镜头会有曝光时间,因此拍摄出来的移动中的物体,往往会带有运动残留效果。

而对于画面不连贯的游戏来说,由于没有考虑运动残留问题,每一帧都是物体当时的确切位置,因而给人以画面跳跃感。不过,有些游戏引擎支持了动态模糊的技术,允许在一帧中计算出动态模糊所需数据,从而渲染出的画面很好地体现了动态残留效果。 动态模糊

为什么游戏帧率是30的倍数呢? 在一些游戏主机上,如PS4和XBox,帧率会限制在30,所以大部分游戏制作者,都会将最低帧率设为30。然后,对于有更高的画质需求的玩家,进行整数倍的帧率变化所做的计算和设计工作,会比其他倍数更容易一些。

很多人都以为帧率越高越好,但实际真是这样的么? 首先要明白,帧率越高,代表每秒电脑屏幕渲染的次数越多,每秒的计算量也越大,这就得确保电脑和显卡的配置必须更高,才能达到计算和渲染的要求。 其次,人眼识别动态画面的帧率是有一定峰值的,当高于这个峰值时,再高的帧率对人来说,也没多大影响。 因此,帧率并不是越高越好,合适就行。

什么是锁帧? 在游戏实际运行中,帧率的不稳定,会给人以画面撕裂感和卡顿现象。尤其在每时每刻都是最大帧率运行的情况下,这种问题特别容易发生(帧率高可能会导致显卡每秒输出画面,高于屏幕的刷新速率)。
所以游戏开发商,一般会采用锁帧的方式,强制帧率在某一个定值。这时候的游戏运行画面都能较好地契合帧率,达到垂直同步效果,而避免画面时快时慢的撕裂感,提高了流畅度。同时还能有富余的效能,进行一些预处理逻辑,及保证游戏的稳定运行。

动态模糊与应用场景

前面提到了动态模糊技术,能使低帧率的画面连贯起来后,给人以流畅感。

但是,在高帧率的情况下,也进行动态模糊,会出现什么情况呢? 在高帧率下使用动态模糊,会使画面具有粘滞感(大概是指不利落感觉吧),甚至会让人产生晕眩感。尤其在FPS(第一人称设计)游戏中,会影响玩家的判断,从而在操作上产生偏差。

如今的大部分游戏,都允许玩家对锁帧的值和运动模糊的开关进行手动设置,所以玩家可以根据自己所使用的游戏设备,进行相关配置的调整,从而达到理想的游戏画面。

画质配置

results matching ""

    No results matching ""