像Game Boy Advance这样的设备如何达到其帧速率?


31

我一直在基于AVR微控制器和小型OLED显示器设计自己的手持游戏设备。

我开始使用128x64像素的单色显示器,并且可以以每秒60帧以上的速度舒适地绘制它。

我最近对其进行了重新设计,使其使用128x128像素的RGB OLED,但并没有想太多,只是发现我只能达到大约4 FPS。经过一番思考和仔细的重构,如果我对任何其他事情都不在乎的话,我可以将帧率提高到约12fps!

我的问题是-像GBA(Game Boy Advance)这样的设备如何达到接近60fps的帧率?我曾考虑过要有一个单独的“图形处理器”,但意识到将显示数据传输到此仍然会遇到瓶颈。

我还想知道使用这些屏幕中大多数都带有残留的8位并行接口,这可能使我的屏幕速度提高8倍,除了现代MCU不像串行和位串行接口那样倾向于具有硬件并行接口。敲打可能会消耗很多速度。

还有哪些其他选择?

我目前正在使用通过USART-SPI连接到SSD1306 OLED控制器的ATmega1284P。那是单色版本。

彩色屏幕是SSD1351,最初未连接到硬件SPI。我不相信这会带来足够的变化,总体来说太慢了

我知道我可以获得更快的MCU,但是我想知道我可以探索的其他选择-GBA处理器比我的1284慢得多!


6
“将显示数据传输到此仍然是瓶颈。” DSI有四个通道,每个通道的速率高达1.2Gbit / s。我将其余的计算留给您。
Oldfart

1
就像任何视频游戏设备中的任何图形一样,内存也可以处理图形。根据网站的说法,这里有一个用于存放图形,声音等的地址。说明将存储在此处。假设没有太多会与性能时间产生冲突的数据,它将运行这些指令来轻松加载图形数据。
KingDuken

5
购买没有控制器的显示器,然后制作自己的控制器
old_timer

4
@immibis:几乎肯定是一些基于I2C或SPI的糟糕控制器。业余爱好者的东西充满了高估的慢东西,例如,由于规模经济,您可以以20美元的价格购买400 dpi的iPhone屏幕。
R.,

6
@R ..我只想指出,使用这些业余控制器的原因是它们可以与几乎所有处理器接口,因为您听起来好像它们毫无用处。如果有的话,您将无法轻松连接到iPhone屏幕。它可能连接到专用的(可能是定制的)图形处理器。
user253751 '18

Answers:


64

其他答案在抽象级别(硬件)上很好地涵盖了您的问题,但是特别是对GBA有实际经验,我认为更详细的解释可能是值得的。

GBA具有许多可用于控制图形处理器如何解释视频RAM的绘制模式和设置,但不可避免的是:帧速率。图形处理器以几乎恒定的循环(下面将对此进行详细介绍)绘制到屏幕上。(这可能是与您的问题最相关的部分。)

它会一次画一条线,而每条线之间要间隔很短的时间。在绘制框架的最后一行之后,将花费大约等于绘制30条线条的时间的间隔。然后重新开始。每行的定时和每帧的定时都被预先确定并固定在一块。在很多方面,图形处理器实际上是该系统的主人,您需要围绕其行为编写游戏,因为无论您是否准备就绪,它都会继续做它所做的事情。

大约有75-80%的时间是主动将其推送到屏幕上。如果您执行相同的操作,则可以完成什么帧速率?

80%的时间也是CPU必须处理用户输入,计算游戏状态并将子画面/图块加载到当前不在屏幕上(或至少不包括在当前绘制的行中)的VRAM区域的时间。

帧之间的20%是CPU必须调整会影响整个下一帧的视频设置或RAM的全部。

在每行的末尾,图形处理器将向CPU发送行同步中断。此中断可用于调整一些子画面或一些背景层的设置(通过更改绘制的每条线之间的矩形遮罩之一的大小和位置,可以通过这种方式来获得像圆锥形聚光灯一样的效果。就硬件而言,所有这些区域都是矩形的。)在图形处理器开始绘制下一行之前,您必须小心使这些更新保持较小并完成,否则您可能会得到难看的结果。任何花费在处理这些中断上的时间都将占用CPU 80%的处理时间...

对于充分利用该系统的游戏而言,CPU和图形处理器都从未真正中断过。每个人都在跟踪对方,更新对方当前未查看的内容。


5
欢迎和放。
Mindwin

2
诸如Nintendo DS之类的某些“较新”系统通过添加VCOUNT寄存器将下一帧延迟可配置的时间(通常是为了帮助多人游戏同步)来解决固定帧速率限制。
森林

21

使它们与早期PC和几乎所有家用计算机(1)区别开来的所有游戏机的关键功能是硬件精灵

链接的GBA编程指南从主处理器的角度显示了它们的工作方式。代表玩家,背景,敌人等的位图被加载到内存的一个区域中。内存的另一个区域指定了精灵的位置。因此,处理器不必更新每一帧的所有视频RAM(这会花费很多指令),而只需更新子画面的位置即可。

然后,视频处理器可以逐像素工作,以确定在该点绘制哪个精灵。

但是,这需要在两者之间共享双端口RAM,我认为在GBA中,视频处理器与主ARM和辅助Z80处理器位于同一芯片上。

(1)值得注意的例外:Amiga


只有一种-真正的早期街机游戏将子画面放在与图形处理器关联的ROM中,而不是在双端口RAM中。我不知道早期的游戏机是否也是如此,尽管当然可以那样做。
TimWescott

@TimWescott GBA确实有多种绘制模式,而我大多数人都没有经验,所以这可能不是普遍适用的,但是,我认为这些模式中的任何一种都不能直接访问ROM(在盒式磁带上):通常,所有必须将tile / sprite / palette数据从ROM传输到视频内存,然后图形处理器才能从那里进行处理。
Mindor先生

@ Mind.Mind先生对不起,如果我不清楚,我不会假装对GB或GBA的了解。我只是在评论70年代末和80年代初真正意义上的Nintendo早期街机游戏,这让我们所有人都想知道他们如何做到的
TimWescott

@TimWescott:我认为NES也是如此,尽管有问题的ROM位于Game Paks内。
超级猫

19

“我的问题是-GBA之类的设备如何实现接近60fps的帧率?”

为了回答这个问题,他们使用图形处理器来解决。我很确定Game Boy使用了精灵图形。在最高级别上,这意味着图形处理器将加载诸如背景图像,马里奥图像和公主桃图像等内容。然后,主处理器发出诸如“通过此图像显示背景偏移量”的命令。在x和y上占很多,在此x,y位置上覆盖Mario图像#3”,等等。因此,主处理器绝对不会与绘制每个像素有关,图形处理器绝对不会与计算像素的状态有关。游戏。每款游戏都针对其需要进行了优化,结果是一款不错的视频游戏,而无需使用大量计算能力。


7
称其为“图形处理器”会夸大其功能,表明它本身就是某种CPU。它只是一个视频控制器,基本上是一种复杂的音序器。当它计算水平和垂直像素时,它将获取标题和/或子画面数据,将其放入移位寄存器中,然后将移位寄存器的输出合并为一个输出像素。它无法运行像实际的“ GPU”图形处理器那样的程序。
罗斯里奇

14

GBA的处理器速度很慢。ARM7很好。他们只是运行缓慢,几乎没有资源。

有一个原因为什么当时和之前的许多Nintendo游戏都是侧滚。硬件。这些都是在硬件中完成的。您有多层瓷砖以及一个或多个精灵,硬件完成了所有工作以从这些表格中提取像素并驱动显示。

您先建立了图块设置,然后才有了一个很小的内存,即图块地图。希望左下图块成为图块7?您在该内存位置中放置了7。希望下一个图块成为19图块吗?在图块集中,您在其中放置了19,依此类推,对于已启用的每个图层。对于精灵,您只需设置x / y地址。您还可以通过设置一些寄存器来进行缩放和旋转,而硬件则负责其余的工作。

如果我没记错的话,模式7是像素模式,但是它就像传统的视频卡一样,在其中放置字节来覆盖像素的颜色,并且硬件负责视频刷新。我认为您可以进行乒乓球运动,或者至少在有新框架时可以翻转它们,但我记不清了。同样,在那个时代,处理器的时钟频率相当低,并且没有太多的快速资源。因此,尽管有些游戏是模式7,但很多都是基于图块的侧卷轴...

如果您想要高帧率的解决方案,则需要设计该解决方案。您不能只是将找到的任何旧显示器通过SPI或I²C或类似的东西与之对话。在其前面至少放置一个帧缓冲器,最好是两个,并在可能的情况下对该行进行行和列控制。

我怀疑您要购买的许多显示器上都有您正在实际与之交谈的控制器。如果要获得GBA /控制台类型的性能,则可以创建/实现控制器。或者您使用GPU /视频芯片/逻辑块进行购买/构建,然后将HDMI或其他通用接口用于股票监视器。

仅仅因为自行车有轮胎,链条和齿轮并不意味着它可以像摩托车一样快地行驶。您需要端对端设计系统以满足您的性能需求。您可以将自行车车轮放在摩托车上,但效果不理想。所有组件都必须是整体设计的一部分。

小行星也是如此。它只需要一个6502。矢量图形是用单独的逻辑完成的;6502将一小串数据发送到矢量图形控制器,该控制器使用ROM和该数据对光束和z进行xy绘制,并进行开/关操作。某些站立式处理器具有单独的处理器来处理音频和视频。计算游戏的处理器。当然,今天的视频是由与主处理器分开的数百个(甚至数千个)处理器处理的。


我发誓我记得mode7被市场推horn,作为对Sega的“超级模式”之类的回应……也许是“ Super FX”?en.wikipedia.org/wiki/Mode_7
Caleb Jay

coranac.com/tonc/text/bitmaps.htm#sec-modes 我可能已经记错了,我想的可能是模式5或位图模式之一,其中有一些带有子画面的图块模式以及位图/帧缓冲模式或多个模式。也许有一个7.不知道您链接的那个,但这很高兴。
old_timer

嗯阅读更多关于模式7的信息,而不仅仅是一个模式。无论如何,GBA具有分块模式和位图模式,它们较慢,因为您必须负责分块模式中一个字节产生许多像素的分块模式下的每个像素。他们还利用总线的大小(宽度)和内存的速度,以及rom管道缓存的东西来帮助更快地从rom中取出东西(指令)。但是从第一天开始,您就一直在努力使软件以适当的速度运行,而且值得庆幸的是,逻辑处理了大部分视频工作。
old_timer

如果您查看要购买的这些显示器,这些显示器具有这些并行的8位或4位或spi或i2c接口,这些都是您提高性能的方式,则您希望没有这些控制器的原始显示器,然后可以控制如何管理该显示器,构建一两个帧缓冲区,以便您可以ping / pong和从CPU到帧缓冲区的快速接口。假设您首先以足够快的显示开始。
old_timer '18

7

像GBA这样的设备如何实现接近60fps的帧速率?

硬件。

它具有图形存储器,它可以与程序/数据存储器共享同一总线,也可以不共享总线...但是重要的一点是,它具有图形处理器,该处理器每秒读取存储器60次,然后使用优化的界面,旨在有效地做到这一点。

您可以对配备有“ LCD接口”外围设备的任何现代微控制器(例如LPC4330)执行相同的操作,尽管这可能会显得过大。当然,您将需要兼容的LCD面板。

使用现代的快速微控制器(即ARM而不是AVR)和如此小的屏幕,您可能不需要Sprite或Blitter来加速图形操作。使用8位AVR可能会很慢。

但是,无论使用cpu,还是会撞到显示器的接口都会很烂。

我相信Atari 2600使用了CPU位冲击将图像发送到电视。有点过时了。


甚至2600都有硬件精灵,尽管数量非常有限(我认为有两名玩家和两发子弹)
pjc50

2
@ pjc50,雅达利2600 之类的有硬件精灵。像图形子系统的其他所有部分一样,它们都是一维对象。如果程序员想要一组垂直线以外的其他东西,则程序需要在将每一行绘制到屏幕后更新精灵。
标记

1
@Mark:2600肯定有硬件。硬件仅控制水平位置,但是2600上的精灵使游戏制作出比其竞争对手更丰富多彩的游戏成为可能。
超级猫
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.