Graphics 经典侧滚器是如何实现定时事件和动画触发器的?

Graphics 经典侧滚器是如何实现定时事件和动画触发器的?,graphics,assembly,Graphics,Assembly,我一直对Snes上的超级马里奥系列感到惊讶。我想它主要是由Z80组装而成的。但是,既然没有实时时钟,他们究竟是如何管理所有那些装配了组件而没有实时时钟的定时、动态事件的呢 感谢Z80支持多个硬件中断-其中一个可能连接到定期定时器(例如每10毫秒一次)。一些早期游戏机的定时与电视扫描刷新有关,所以这可能已经连接好了。我不知道SNE,所以我根据其他当代系统的工作原理进行推测 维基百科说SNES是一个16位的系统,所以它不是一个8位的Z80。 实际上它说是65c816 (上面的链接讨论了视频同步中断

我一直对Snes上的超级马里奥系列感到惊讶。我想它主要是由Z80组装而成的。但是,既然没有实时时钟,他们究竟是如何管理所有那些装配了组件而没有实时时钟的定时、动态事件的呢


感谢

Z80支持多个硬件中断-其中一个可能连接到定期定时器(例如每10毫秒一次)。一些早期游戏机的定时与电视扫描刷新有关,所以这可能已经连接好了。我不知道SNE,所以我根据其他当代系统的工作原理进行推测

维基百科说SNES是一个16位的系统,所以它不是一个8位的Z80。 实际上它说是65c816


(上面的链接讨论了视频同步中断,因此假设您对实时时钟的看法是正确的,那么我的观点可能是正确的)

在旧硬件上使用的一种非常常见的技术是依赖于用于显示图形的相同计时硬件。旧硬件通过从内存中读取像素值并将其与一些“同步”信号一起放在端口上,从而控制电视中的扫描电子枪,从而将数据从图形端口(复合视频,或更常见的RF)中逐行传输出去


好的一点是,垂直同步信号,使枪从屏幕底部向顶部摆动的信号,通常连接到控制台CPU上的硬件中断,在这一时刻,每秒发生29.97次(几乎30fps),发生在根本没有通过视频发送数据的时刻,因为光束“飞回”屏幕顶部需要一些时间。此时在视频内存中所做的更改将不会闪烁

需要记住的一个重要概念是VSync速率。这是电视中的电子枪(或现代电视中的等效电子枪)完成绘制屏幕并缓慢移动到屏幕顶部的频率

因为这是以恒定速率发生的(NTSC为60次/秒,PAL为50次/秒),所以大多数游戏都将其用作计时器,其代码大致相当于:

void main() {
    while(true) {
        updateGame();
        updateSprites();
        waitForVSync();
    }
}
显然,这被大大简化了,但事实就是如此。有些游戏非常复杂,耗时太长,错过了VSync周期。在这种情况下,他们会等待第二个VSync,从而以每秒30(/25)帧的速度运行

有时候,你会注意到NES游戏的速度变慢(例如)。这是指工作负载非常重,以至于在单个动作帧中缺少几个VSync周期


但是,是的,这就是老式游戏机计时工作的要点(实际上,即使是许多较新的游戏机和PC游戏都使用相同的系统,而不仅仅是旧的游戏机!)

游戏,然后像现在一样,通常运行一个固定的时间步长循环(参见Mike Carons的回答)。本来主要是为了方便,;渲染已同步到显示刷新率以避免撕裂,最好每帧运行一次所有基于时间的处理


如今,大多数游戏仍然以离散的步长推进时间,这是一些基本速率的倍数,通常为50/60 Hz或100 Hz左右-一些游戏仍然有基于VSync的计时,但现在大多数游戏只是使用常规计时器。如今,我们使用固定时间步长的原因略有不同:首先,游戏通常至少会进行一定量的物理模拟,而且很难让可变时间步长的物理模拟保持稳定-特别是在像游戏这样的实时应用程序中,通过使用更精确的集成方法等,您无法轻松地向其投入更多的计算能力。第二,如果你有任何类型的网络多人模式,你需要确保游戏对所有玩家保持同步。如果每个人都使用不同的计时器并以不同的速率处理事件,那么这几乎不可能进行管理(和调试)。强制每个人使用一个共同的时间步长使问题更容易处理几个数量级,因为你可以安全地假设两个玩家在相同的状态下开始并获得相同的输入,5秒后仍然处于相同的状态,即使玩家看不同的东西或拥有不同的机器,所有这些都会影响游戏运行的实际帧速率(因此也会影响游戏处理事件的速率)。

我不确定你所说的“实时时钟”是什么意思,但依赖Z80作为通用处理器的控制台也有专用硬件来制作精灵动画和播放声音。Z80只是给这些人下订单。我也想知道这一点!我一直认为这更像是“当X在这里时,Y会这样做”之类的事情。旧游戏通常是围绕它们运行的屏幕帧速率同步的,所以它们每帧更新一次精灵(即50hz或60hz,取决于它是PAL还是NTSC系统)在SNES上的超级马里奥:超级马里奥世界和吉西岛。这两个都不是Z80。这就是GB(C)@Kawa——事实上,NES和SNE分别基于定制的MOS 65xx核,理光2A03和5A22。顺便说一句,GB(C)是什么?你一直说的“道德对等”是什么?我不认为它的意思是你认为它的意思,我是这样使用它的,“X在道德上等同于Y”大致上是指,“X和Y不一样,而且可能完全不同,但用途相似”。在做了一些研究后,我意识到我用错了它,所以我将从我的答案中编辑它。在大多数较旧的系统上,偶数和奇数字段之间没有区别,所以视频帧速率大约为60Hz。有趣的是,在Atari 2600上,处理器负责生成垂直定时,因此帧速率可以高于或低于60Hz,在电视机的容差范围内。其中一个芯片(“暴动”)包括一个带有预分频器的下行计数器,可以预先设置