所有游戏都是通过绘制每一帧制作的吗?


60

我是一个初学者,学习计算机动画(用于游戏)。到目前为止,我遇到的唯一方法是绘制每一帧,每一帧更新。因此,在每一帧的开始处,将擦除整个帧,然后重新绘制该帧所需的内容。

我的问题是这种方法是否是唯一一种用于制作动画和游戏的方法。似乎效率不高。我也不太了解这种方法在3d游戏中的作用。有人可以详细解释一下吗?


评论不作进一步讨论;此对话已转移至聊天
乔什(Josh)

约翰·卡马克(John Carmack)几乎是在PC上发明了一种方法,该方法仅绘制已更改的垂直屏幕垂直切片即可进行全屏侧滚动。如果没有这项技术,个人电脑根本无法足够快地更新全屏显示。在90年代初期,他在诸如Commander Keen的许多2D游戏中使用了此功能。阅读“末日大师”了解更多信息。
Ash Ash

Answers:


68

很老的游戏使用的技术是仅重画框架中那些在该框架上更改过的部分。我还记得,游戏“ Little Big Adventure”使用了这种技术(1994年)。但是您可以看到游戏在大多数情况下都具有静态相机。仅当您移出可见区域时,场景才会重绘。如果您玩游戏,您还会注意到该帧上的微小滞后。在具有现代游戏引擎的现代GPU上,情况已经改变。每一帧都重新绘制了所有内容。取决于渲染技术,事物甚至可能被渲染多次。如果正确使用GPU,其计算能力将非常高。但是重用正在发生。例如,引擎可以决定仅每5帧更新一次阴影贴图。或只要光源没有变化,照明就不会更新。


22
不只是旧游戏。在EA,人们一直在努力减少某些“休闲”游戏的笔记本电脑电池使用量,而一种技术是仅重绘部分屏幕。如果您将相机保持静止并且模拟物走过屏幕,有时您可能会在《模拟人生3》中看到此情况,有时会出现一个错误,即重绘的大小不够大,并且您会看到在屏幕。您只需要稍微移动摄像机以强制完全重画,线条就会消失。
凯文·费

12
很老.. 1994年...我现在感觉很老...
alseether

4
@alseether在游戏方面比较老。请记住,在短短20到30年的时间里,我们从8位像素斑点变为逼真的照片(如果不是实景拍摄,则是预先渲染的过场动画)。
贾里德·史密斯

16

没有。

至少如果您包括使用矢量显示的70年代的旧游戏。

例如,广为人知的游戏《小行星》最初是为矢量显示而开发的,它是将图形呈现到屏幕的根本不同的方式。

在1970年代末至1980年代中期的某些街机游戏中也使用了矢量监视器,例如小行星,暴风雨和星球大战。将术语Quadrascan形容为在其视频游戏机廊中使用时描述的技术。

https://zh.wikipedia.org/wiki/Vector_monitor

现代图形几乎是100%用于栅格化的,根据定义,栅格化将图形缓冲区的内容写入每一帧。


7
向量显示甚至没有明显的“框架”。
hobbs

2
@hobbs正确,这使我的答案仍然正确,因为答案是“所有游戏都是通过绘制每帧制作的吗?” 是“否,甚至不是所有游戏都基于帧绘制。”
桑迪·查普曼,

1
但是,从更深的意义上讲,问题是关于反复绘制所有可见的项目,而不仅仅是移动的项目,对于大多数矢量显示,答案仍然是“是”(图像存储管将是个例外)
szulat

@szulat的确是正确的,但说句公道话,它仍然没有填补显示为黑色的空白。它仅刷新屏幕上的可见项目。即在小行星中,它只是重新绘制飞船,并在屏幕上重新绘制其余的小行星。
桑迪查普曼

@SandyChapman和另一个层面上的差异很小。游戏会在某些更改时更新屏幕内存或图片。否则,显示屏的相应部分将保持静态。这对于光栅和矢量系统都是如此-“小行星”可以从(矢量!)屏幕内存中处理屏幕刷新,而不会干扰cpu,这与zx频谱硬件如何生成其光栅视频信号类似。次要的是实心或假想的crt光束是绘制多边形还是以固定模式扫描屏幕。
szulat

11

在最低级别上,计算机上的图形处理器确实将从头开始计算每个帧并将其发送到屏幕。但是,只有您自己管理这些低级内容时,您才会接触到此信息。[1]但是,任何图形(以及带有该游戏的)引擎都将为您处理这些事情,并且您可以自由地表示场景在许多实体之间,您可以在框架之间进行修改,但这些实体将是持久的。

...这种方法如何在3D游戏中起作用...

3D空间中的元素是持久性的,图形引擎将再次为屏幕上的图像重新计算发生的任何更改(相机移动等)。

[1] ...例如,如果您使用类似OpenGL的代码编写自己的引擎[2]。即使在这种情况下,您也可能会在帧之间存储持久性内容。

[2] 在您当前的技能水平上,这不是一个选择。


您是否有支持“机器上的图形处理器确实可以从头开始计算每一帧”的参考?
克罗姆斯特

@Kromster:这主要是效率问题。由于每个帧可能需要完整的计算,而且不确定哪些部分不需要,因此您需要进行昂贵的计算才能确定可以节省哪些位。即使这将是净性能的提高,也会导致不一致的帧速率。
MSalters

@MSalters的表达方式与许多邻居答案中的许多要点相矛盾。
Kromster

我会说“您的计算机上的图形处理器确实可以从头开始计算每一帧”的说法在技术上是不正确的。GPU会精确计算您告诉的内容。如果要重用前一帧,则它将(实际上是默认值)。许多现代游戏引擎(甚至是操作系统GUI)的确选择从头开始(仅当新框架未及时完成渲染时才显示前一框架),但并非必须如此。
奥雅纳

我什至不知道什么构成了“必须清除屏幕”的参考,但是有关于如何在《毁灭战士》中渲染帧的参考:adriancourreges.com/blog/2016/09/09/doom-2016-图形研究 ; 不要忘记,中等高端的图形卡应该能够每秒处理1万亿次计算,每个像素几千次。
pjc50 '18

2

简短答案:不可以。

很长的故事:

当我在学校学习一些游戏编程时,我们被教导要做以下事情:

确定我们在游戏中想要的fps速率(例如30)。

编写一些代码,为每个间隔(33毫秒,每秒30帧)加1。此代码与游戏循环同时运行。

然后,执行游戏计算(游戏状态更新)的游戏循环将使每个帧的相同计数器减少1。但是,只有在计数器为零时,才可以进行图形计算和绘制到屏幕上。

结果是,图形帧速率将根据cpu处理游戏中计算的效果而调整。当游戏中发生的事情不是很多时,计算将很容易,并且图形帧速率将高于实际游戏状态更新(基本上是浪费周期,因为我们在屏幕上绘制同一游戏状态不只一次)。

但是随后在游戏中发生了很多事情,cpu将有更多工作要做,并且游戏状态更新将优先于在屏幕上绘制。

在大多数情况下,游戏将以预期的速度进行更新,但是由于您在屏幕上看不到每个更新,因此游戏会显示“缓慢”。这可能是整个游戏速度降低的原因,因为您强迫它确实在屏幕上绘制每个更新。

这一切都是用C ++完成的,没有游戏引擎,也没有图形卡。一切都在一个核心cpu上运行。我们将一些库用于2D图形。


1
我记得游戏“金斧”。例如,在8086上玩时,游戏速度比286上慢,并且处理起来也容易得多。仅供参考。
akostadinov

0

在说视频游戏是否每帧“绘制”显示器之前,首先必须定义“绘制”的含义。当然,有很多视频游戏肯定不是全部都是通过从头开始组装位图来绘制每一帧的。事实上,许多游戏平台从来没有装配满位图在所有

电子游戏可以采用几种方法来生成显示。很少有CPU可以打开或关闭电子束或为每个像素打开或关闭电子束,或者对于矢量扫描游戏,可以设置要绘制的每个点的XY坐标。大多数这样做的游戏主要是为了证明CPU足够快。更常见的游戏将具有硬件,在不涉及CPU的情况下,这些硬件会重复向显示器输出某种像素或矢量模式。可以通过从内存区域顺序读取数据并将每个位或位组解释为像素颜色来生成此图案(这称为位图显示)。在某些情况下,硬件可能会为每个8x8、16x16,或其他大小的显示区域,然后使用该字节选择要读取像素数据的内存范围(通常称为字符映射表显示)。某些硬件平台可以将多个位图显示与可配置的位置重叠。这些被称为子画面。

某些平台不允许在将显示模式发送到屏幕时进行更改,而是要求在光束完成绘制一帧之后但在开始绘制下一帧之前进行所有更新。在这样的平台上,将要出现在框架上的所有内容都必须在该框架开始之前被加载到显示硬件中,并且显示器将限于显示可以一次全部设置的图案。如果在显示框架时CPU停止运行,则该框架将一直无限显示。其他平台确实允许在将图案绘制到屏幕时更改或重新配置图案。这样就可以显示比视频电路本身处理起来复杂得多的屏幕。

大多数个人计算机游戏都使用配置为绘制单个位图屏幕的硬件,然后在该屏幕上绘制需要与现有屏幕不同的任何内容。有时,在不考虑在特定情况下是否确实需要绘制内容的情况下,绘制内容可能会更容易,但是如果代码可以轻松地告诉您没有理由更改屏幕的一部分,则可以跳过该部分来提高性能。当今的平台通常足够快,以至在一帧的过程中它们可以多次绘制整个屏幕,但从历史上看并非如此。例如,最快的代码来写入Apple II计算机的高分辨率屏幕上的所有像素,将花费两个以上的帧,而最快的代码来复制Apple II计算机的所有像素。另一个缓冲区的高分辨率屏幕将花费两倍的时间。要获得良好的性能,就需要游戏仅更新实际发生变化的事物,而这正是优秀游戏通常所做的。


1
我到达了这个答案的一半,我不确定它实际上是如何回答这个问题的。您的第一段谈论的是CPU,XY坐标,电子束,内存字节和子画面-但这显然与绘制每一帧无关。第二段是详细讨论显示模式,然后让我迷失了。我认为您需要采取任何有关实际重绘屏幕的部分,将其放在清晰的语句中,然后将您需要讨论的其他内容重新连接起来,以说明发生了什么。
doppelgreener

1
@doppelgreener:“绘制”每个框架的概念有点模糊。必须做一些事情来生成每个帧,但是可以通过CPU和硬件划分许多工作方式。有些方法要求每一帧都涉及CPU,即使屏幕的一部分在下一帧和下一帧之间看起来相同,而其他方法则不需要。尽管任何LCD或CRT游戏最终都需要在每个非空白帧中输出某些内容(使用电子纸或活页显示器的游戏可能不会输出),但所需的动作可能会或可能不会被视为“绘图”。
超级猫

我建议您从简单的语言开始(无论我们是否不断地“绘制框架”),然后从那里开始解释更多的技术细节,以解释为什么这可能不是准确的表达方式,而不是直接深入细节。在开始深入研究您的工作之前,您的帖子基本上需要执行摘要和简介。
doppelgreener

-11

简而言之,我不会说所有的画框都是绘制的,而只是表达您的故事或游戏或游戏主题所需的画框。再加上在某些情况下您想要发生的事情的时间安排将很重要。


9
我什至认为您对“框架”感到困惑……您可能会与故事板上的元素相混淆吗?OP专门讨论渲染
Trotski94,18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.