graphics - 老游戏中的 "side scrolling hack"是什么?

标签 graphics 2d demoscene

我听说旧的街机横向滚动游戏使用特定的编程技巧来实现高性能横向滚动。

据我了解,几年前,机器的功能还不足以像现在那样每帧重新绘制整个屏幕。有一些技术,例如脏矩形,可以在背景静止且只有 Sprite 移动时最小化重新绘制所需的屏幕区域。

上述方法仅在背景不变时有效(因此大多数屏幕像素保持静止)。

垂直滚动游戏,就像老式的射击游戏一样,由于滚动而背景会改变每一帧,所以事情变得有点困难。然而,人们可以利用像素馈送到显示器的方式(逐行)。我想,可以使用更大的缓冲区,并将数据指针每帧“向下”移动一些行,以便从另一个位置开始重新绘制,从而给人平滑滚动的印象。仍然只有 Sprite (以及屏幕边缘的一些背景)需要重新绘制,这是一个重大的优化。

但是,对于横向卷轴游戏来说,事情就没那么简单和明显了。不过,我知道有人在过去的某个地方进行了优化(有一些限制),允许旧机器水平滚动背景,而无需每帧重新绘制背景。

IIRC 它被用在许多老游戏中,主要是 80 年代的节奏游戏,以及演示场景制作

您能描述一下这项技术并指出其作者​​吗?

最佳答案

我已经为老式的 C64 编写了游戏,正是这样做的。基本上有两件事需要注意:

  1. 这些游戏没有使用位图图形,而是使用“重新映射”字符字体,这意味着 8x8 像素 block 实际上只是一个字节。

  2. 接下来要注意的是,硬件支持将整个屏幕替换为七个像素。请注意,这不会以任何方式影响任何图形 - 它只是使发送到电视的所有内容都有点移位。

所以 2) 使得真正平滑地滚动 7 个像素成为可能。然后你移动每个字符 - 对于全屏来说正好是 1000 字节,计算机可以处理,同时你将滚动寄存器向后移动 7 个像素。 8 - 7 = 1 意味着您看起来又滚动了一个像素...然后就这样继续下去。所以 1) 和 2) 结合起来就产生了真正平滑滚动的错觉!

之后第三件事开始发挥作用:光栅中断。这意味着当电视/显示器即将开始在指定位置绘制扫描线时,CPU 会收到中断。该技术使创建分屏成为可能,这样您就不需要滚动整个屏幕,这与我的第一个描述相反。

更详细地说:即使您不想要分屏,光栅中断也非常重要:因为它当时和今天一样重要(但今天框架对您隐藏了这一点) )在正确的时间更新屏幕。当电视/显示器在可见区域的任何位置更新时修改“滚动寄存器”会导致称为“撕裂”的效果 - 您可以清楚地注意到屏幕的两个部分彼此不同步一个像素。

还有什么好说的?嗯,重新映射字符集的技术使得制作一些动画变得非常容易。例如,传送带、齿轮等可以通过不断改变屏幕上代表它们的“角色”的外观来制作动画。因此,只需更改字符映射中的单个字节,跨越整个屏幕宽度的传送带就可以看起来像在各处旋转。

关于graphics - 老游戏中的 "side scrolling hack"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8113243/

相关文章:

java - SurfaceView 显示为空,没有渲染任何内容

javascript - 缩放多边形使边匹配

c++ - 对演示场景大小限制有何影响?

c# - .NET 中的动画效果?

r - 如何在ggplot2中旋转图例符号?

c - 学习 OpenGL 需要具备扎实的数学基础吗?

c++ - GNU/Linux 中 "drawing"抽象的绝对最低级别是什么?

python - Python 中的二维插值

opencv - 小型二维点集的简单配准算法

python - 如何使用改进的 DFS 算法遍历循环有向图