为什么游戏流畅需要60帧,而电影流畅只需要24帧?

简介: 平时我们看的电影,大都是 24 帧,偶尔有几部大制作电影,帧数才会达到 48 或者 60。那么,为什么电影 24 帧就很流畅,而我们玩电脑游戏就要 60 帧起步才算流畅呢?

这里要先说一下帧的概念。我们经常看到一些动图,就是多张图片连接在一起,从而让人感觉到有动起来的效果。

1.gif

这个动图里的一张图片,就是一帧。电影里一秒有 24 张图片,帧数就是 24 帧/秒,换成英文也就是 24FPS。电影和游戏里,帧数越高,我们所看到的画面也就越流畅。


但电影和游戏有一个最大的不同:电影是摄像机拍出来的,而游戏是引擎渲染出来的。


2.png


一、模糊帧与清晰帧


网络异常,图片无法展示
|

这是我截取《小丑》电影里的一张图,可以看到,这里小丑的图是模糊的。这种模糊图就叫做模糊帧。


模糊帧的好处是能够记录一段时间内的所有信息。比如说下面的红衣小孩,1 秒内跑了一段距离,而摄像机是 1 秒 1 帧,那么我们就可以在这一帧里看到这 1 秒内小孩所有的运动信息。

4.png

电影中所有用摄像机拍出来的画面都是模糊帧,都记录了短时间内运动的所有信息。所以尽管电影 1 秒只有 24 帧,但这 24 帧包含了 1 秒内所有的运动状态和运动信息,我们自然也就觉得很流畅了。


而游戏和电影恰好相反,由引擎渲染的画面全部都是清晰帧,除非你开动态模糊,否则任意时刻截图一定是清晰帧。

5.png

清晰帧用来截图当壁纸是很不错的,但它有一个最大的问题就是帧与帧之间的过渡信息丢失了。在游戏里,一帧的时间内,人物从 A 运动到 B,只有 A 点的图和 B 点的图,是没有从 A 到 B 的过程图的。这也就导致了游戏的帧率必须要比电影高很多,才能保证看上去很流畅。


二、帧生成时间


影响流畅度的不仅有清晰帧和模糊帧,还有帧生成时间。


电影里,一秒就是 24 帧,这是固定的,每一帧都是 0.042 的间隔。这个间隔就是帧生成时间,帧生成时间恒定,所以帧与帧之间就很平滑。


而电脑游戏的帧生成时间不是恒定的。在不同的游戏场景里,帧生成时间是不同的。比如你在大雪环境下,0.025 秒生成一帧,那到了森林,可能就要 0.05 秒一帧。从大雪进入森林,帧数就会波动,导致画面看上去不流畅。

6.png


6.png

三、交互性


电影只是用来看的,那么只需要保证音画同步,我们就不会觉得违和。


但是游戏是用来玩的,所以不仅需要保证音画同步,还需要保证你所有的输入操作都和屏幕实时同步,不然就会被我们的大脑所捕获到,产生违背日常认知的感觉,这种感觉就会让你很难受。


一般来讲,正常情况下,普通人对于游戏画面的响应时间在 100ms 左右,如果我们晃动鼠标,鼠标晃动这个画面在 100ms 内输出到了显示器上,你就不容易察觉不到输入延迟。


而我们的游戏引擎工作原理决定了一件事就是我们的操作必须要 3-5 帧之后才能反馈到屏幕上,如果是 60 帧的画面,操作延迟大概在 70-110ms 左右,你很难察觉,而如果是 24 帧的画面操作延迟就达到了 150-240ms ,如果是 30 帧,那么延迟也在 100-180ms 之间,也就是你的操作反馈到屏幕上会出现滞后的现象,那么这就会违背你的认知,让你非常难受


7.png7.png

7.png

所以这里有个结论,就是你的帧数越低,你的操作延迟越高,而很明显 60 帧已经是 100ms 附近的极限值了,也就是说,如果你使用的是 PC 端,那你必须要保证帧数高于60你的鼠标才能在 100ms 之内反馈到屏幕上。



目录
相关文章
|
Java 数据库连接 Nacos
nacos常见问题之Nacos2.0.3集群模式启动报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
编解码 算法 数据安全/隐私保护
[资料]airplay协议
[资料]airplay协议
484 0
|
6月前
|
人工智能 运维 算法
AI浪潮下程序员的职业重构与生存指南
当代码生成器能写出比人类更规范的代码时,程序员的价值在哪里?这个问题曾让我陷入长时间的思考
|
JavaScript 安全 Python
Python pyclamad病毒扫描与目录病毒扫描脚本(转载)
Clam AntiVirus(Clam AV)是一个免费而且开放源码的防毒软件,软件与病毒库的更新由开源社区免费发布,目前ClamdAV主要为Linux、Uinux系统提供病毒扫描查杀pyClamad是一个python的第三方模块,可让python直接使用ClamAV病毒扫描守护进程clamd来实现一个高效的病毒检测功能。
1687 0
|
4月前
|
关系型数据库 Linux 数据库
Linux系统安装Postgre和Postgis教程
本文详细介绍了PostgreSQL/PostGIS的卸载与安装步骤。卸载部分涵盖Docker、Yum/RPM及源码编译安装的清理方法,包括停止服务、删除容器/包、清理残留文件和环境变量等操作,并强调卸载前需备份数据库数据。安装部分提供在线yum安装和离线源码编译两种方式,前者简单快捷,后者需准备依赖(如gcc、readline-devel等)、创建用户组、初始化数据库及配置访问规则。每步均附带命令示例,确保操作清晰明确。
589 0
|
6月前
|
监控 Java API
【Java并发】【ReentrantLock】适合初学体质的ReentrantLock入门
前言 什么是ReentrantLock? ReentrantLock 是 Java 并发包 (java.util.concurrent.locks) 中的一个类,它实现了 Lock 接口,提供了与
233 10
【Java并发】【ReentrantLock】适合初学体质的ReentrantLock入门
|
JavaScript 前端开发
Bootstrap-Switch开关控件使用指南
Bootstrap-Switch开关控件使用指南
|
11月前
|
编译器 Linux C++
《C++跨平台编译:打破系统边界,释放代码潜能》
C++作为一门强大的编程语言,在多元化软件开发环境中面临跨平台编译的挑战。本文探讨了跨平台编译的重要性,包括拓宽用户群体和资源利用,以及面临的操作系统差异、编译器差异和依赖库问题。通过使用跨平台构建系统、抽象平台相关代码和管理依赖库等策略,可以有效应对这些挑战,提升软件的市场竞争力和资源利用效率。
216 0
|
前端开发 JavaScript
前端基础(七)_DOM元素获取(getElementById、getElementsByTagName、getElementsByClassName、querySelector等)
本文介绍了如何在前端通过不同的方法获取DOM元素,包括getElementById、getElementsByTagName、getElementsByClassName、querySelector和querySelectorAll。
720 3