我是一个初学者,学习计算机动画(用于游戏)。到目前为止,我遇到的唯一方法是绘制每一帧,每一帧更新。因此,在每一帧的开始处,将擦除整个帧,然后重新绘制该帧所需的内容。
我的问题是这种方法是否是唯一一种用于制作动画和游戏的方法。似乎效率不高。我也不太了解这种方法在3d游戏中的作用。有人可以详细解释一下吗?
我是一个初学者,学习计算机动画(用于游戏)。到目前为止,我遇到的唯一方法是绘制每一帧,每一帧更新。因此,在每一帧的开始处,将擦除整个帧,然后重新绘制该帧所需的内容。
我的问题是这种方法是否是唯一一种用于制作动画和游戏的方法。似乎效率不高。我也不太了解这种方法在3d游戏中的作用。有人可以详细解释一下吗?
Answers:
很老的游戏使用的技术是仅重画框架中那些在该框架上更改过的部分。我还记得,游戏“ Little Big Adventure”使用了这种技术(1994年)。但是您可以看到游戏在大多数情况下都具有静态相机。仅当您移出可见区域时,场景才会重绘。如果您玩游戏,您还会注意到该帧上的微小滞后。在具有现代游戏引擎的现代GPU上,情况已经改变。每一帧都重新绘制了所有内容。取决于渲染技术,事物甚至可能被渲染多次。如果正确使用GPU,其计算能力将非常高。但是重用正在发生。例如,引擎可以决定仅每5帧更新一次阴影贴图。或只要光源没有变化,照明就不会更新。
至少如果您包括使用矢量显示的70年代的旧游戏。
例如,广为人知的游戏《小行星》最初是为矢量显示而开发的,它是将图形呈现到屏幕的根本不同的方式。
在1970年代末至1980年代中期的某些街机游戏中也使用了矢量监视器,例如小行星,暴风雨和星球大战。将术语Quadrascan形容为在其视频游戏机廊中使用时描述的技术。
https://zh.wikipedia.org/wiki/Vector_monitor
现代图形几乎是100%用于栅格化的,根据定义,栅格化将图形缓冲区的内容写入每一帧。
在最低级别上,计算机上的图形处理器确实将从头开始计算每个帧并将其发送到屏幕。但是,只有您自己管理这些低级内容时,您才会接触到此信息。[1]但是,任何图形(以及带有该游戏的)引擎都将为您处理这些事情,并且您可以自由地表示场景在许多实体之间,您可以在框架之间进行修改,但这些实体将是持久的。
...这种方法如何在3D游戏中起作用...
3D空间中的元素是持久性的,图形引擎将再次为屏幕上的图像重新计算发生的任何更改(相机移动等)。
[1] ...例如,如果您使用类似OpenGL的代码编写自己的引擎[2]。即使在这种情况下,您也可能会在帧之间存储持久性内容。
[2] 在您当前的技能水平上,这不是一个选择。
简短答案:不可以。
很长的故事:
当我在学校学习一些游戏编程时,我们被教导要做以下事情:
确定我们在游戏中想要的fps速率(例如30)。
编写一些代码,为每个间隔(33毫秒,每秒30帧)加1。此代码与游戏循环同时运行。
然后,执行游戏计算(游戏状态更新)的游戏循环将使每个帧的相同计数器减少1。但是,只有在计数器为零时,才可以进行图形计算和绘制到屏幕上。
结果是,图形帧速率将根据cpu处理游戏中计算的效果而调整。当游戏中发生的事情不是很多时,计算将很容易,并且图形帧速率将高于实际游戏状态更新(基本上是浪费周期,因为我们在屏幕上绘制同一游戏状态不只一次)。
但是随后在游戏中发生了很多事情,cpu将有更多工作要做,并且游戏状态更新将优先于在屏幕上绘制。
在大多数情况下,游戏将以预期的速度进行更新,但是由于您在屏幕上看不到每个更新,因此游戏会显示“缓慢”。这可能是整个游戏速度降低的原因,因为您强迫它确实在屏幕上绘制每个更新。
这一切都是用C ++完成的,没有游戏引擎,也没有图形卡。一切都在一个核心cpu上运行。我们将一些库用于2D图形。
在说视频游戏是否每帧“绘制”显示器之前,首先必须定义“绘制”的含义。当然,有很多视频游戏肯定不是全部都是通过从头开始组装位图来绘制每一帧的。事实上,许多游戏平台从来没有装配满位图在所有。
电子游戏可以采用几种方法来生成显示。很少有CPU可以打开或关闭电子束或为每个像素打开或关闭电子束,或者对于矢量扫描游戏,可以设置要绘制的每个点的XY坐标。大多数这样做的游戏主要是为了证明CPU足够快。更常见的游戏将具有硬件,在不涉及CPU的情况下,这些硬件会重复向显示器输出某种像素或矢量模式。可以通过从内存区域顺序读取数据并将每个位或位组解释为像素颜色来生成此图案(这称为位图显示)。在某些情况下,硬件可能会为每个8x8、16x16,或其他大小的显示区域,然后使用该字节选择要读取像素数据的内存范围(通常称为字符映射表显示)。某些硬件平台可以将多个位图显示与可配置的位置重叠。这些被称为子画面。
某些平台不允许在将显示模式发送到屏幕时进行更改,而是要求在光束完成绘制一帧之后但在开始绘制下一帧之前进行所有更新。在这样的平台上,将要出现在框架上的所有内容都必须在该框架开始之前被加载到显示硬件中,并且显示器将限于显示可以一次全部设置的图案。如果在显示框架时CPU停止运行,则该框架将一直无限显示。其他平台确实允许在将图案绘制到屏幕时更改或重新配置图案。这样就可以显示比视频电路本身处理起来复杂得多的屏幕。
大多数个人计算机游戏都使用配置为绘制单个位图屏幕的硬件,然后在该屏幕上绘制需要与现有屏幕不同的任何内容。有时,在不考虑在特定情况下是否确实需要绘制内容的情况下,绘制内容可能会更容易,但是如果代码可以轻松地告诉您没有理由更改屏幕的一部分,则可以跳过该部分来提高性能。当今的平台通常足够快,以至在一帧的过程中它们可以多次绘制整个屏幕,但从历史上看并非如此。例如,最快的代码来写入Apple II计算机的高分辨率屏幕上的所有像素,将花费两个以上的帧,而最快的代码来复制Apple II计算机的所有像素。另一个缓冲区的高分辨率屏幕将花费两倍的时间。要获得良好的性能,就需要游戏仅更新实际发生变化的事物,而这正是优秀游戏通常所做的。
简而言之,我不会说所有的画框都是绘制的,而只是表达您的故事或游戏或游戏主题所需的画框。再加上在某些情况下您想要发生的事情的时间安排将很重要。