Как устройства, такие как Game Boy Advance, достигают своей частоты кадров?


31

Я разрабатывал свое собственное портативное игровое устройство на основе микроконтроллера AVR и небольшого OLED-дисплея.

Я начал с монохромного дисплея 128x64 пикселей и могу рисовать его со скоростью более 60 кадров в секунду.

Недавно я переделал его, чтобы использовать RGB OLED, 128x128 пикселей, не слишком задумываясь, только чтобы обнаружить, что я могу достичь только около 4 FPS. После некоторых размышлений и тщательного рефакторинга я могу получить это до ~ 12 кадров в секунду, если мне не нужно слишком много заниматься чем-то другим!

Мой вопрос - как такое устройство, как GBA (Game Boy Advance), достигло частоты кадров почти 60 кадров в секунду? Я думал о том, чтобы иметь отдельный «графический процессор», но понял, что все равно буду ограничен в передаче данных дисплея.

Мне также было интересно использовать рудиментарный 8-битный параллельный интерфейс, который есть у большинства этих экранов, что может увеличить скорость в 8 раз, за ​​исключением того, что современные микроконтроллеры не имеют аппаратных параллельных интерфейсов, как у последовательных и битовых. стук, скорее всего, съест много прироста скорости.

Какие еще варианты существуют?

В настоящее время я использую ATmega1284P, подключенный к SSD-контроллеру SSD1306 через USART-SPI. Это монохромная версия.

Цветным экраном был SSD1351, изначально не подключенный к аппаратному SPI. Я не был уверен , что это сделает достаточно разницы, это просто слишком медленно в целом

Я знаю, что могу получить более быстрые микроконтроллеры, но я хочу знать, какие еще варианты я мог бы изучить - процессор GBA намного медленнее, чем мой 1284!


6
«Я все еще был бы узким местом, передавая данные дисплея к этому». DSI имеет четыре полосы до 1,2 Гбит / с. Я оставляю вам остальные расчеты.
Oldfart

1
Как и любая графика в любом игровом устройстве, есть память, которая будет обрабатывать графику. Согласно этому сайту, там есть адрес для графики, звука и т. Д. Инструкции будут храниться там. Если предположить, что данных, которые могут привести к конфликтам с производительностью, не много, то эти инструкции будут выполняться для простой загрузки графических данных.
KingDuken

5
купить дисплей без контроллера на нем и сделать свой собственный контроллер
old_timer

4
@immibis: Почти наверняка какой-нибудь ужасный контроллер на базе I2C или SPI. Хобби-фанаты полны медленных вещей с завышенной ценой, например, когда вы можете получить египетный экран iPhone с разрешением 400+ точек на дюйм за 20 долларов из-за экономии на масштабе.
R ..

6
@R .. Я просто хочу отметить, что причина этих контроллеров-любителей заключается в том, что они могут взаимодействовать практически с любым процессором, поскольку вы делаете его звучащим так, будто он бесполезен. Вы не сможете легко подключиться к экрану iPhone, если вообще сможете. Вероятно, он подключается к выделенному и, возможно, пользовательскому графическому процессору.
user253751

Ответы:


64

Другие ответы довольно хорошо охватывают ваш вопрос на абстрактном уровне (аппаратное обеспечение), но, имея конкретный опыт работы с GBA, в частности, я подумал, что более подробное объяснение может стоить того.

У GBA было много режимов рисования и настроек, которые можно было использовать для управления интерпретацией графическим процессором видеопамяти, но одно было неизбежно: частота кадров. Графический процессор рисовал на экране почти (подробнее об этом ниже). (Это, вероятно, самый важный бит для вашего вопроса.)

Он будет рисовать одну линию за раз, делая очень короткий перерыв между ними. После отрисовки последней линии для кадра потребуется перерыв, примерно равный времени, необходимому для отрисовки 30 линий. Тогда начни снова. Время каждой строки и время каждого кадра были заранее определены и установлены в камне. Во многих отношениях графический процессор действительно был хозяином этой системы, и вам нужно было создавать свои игры в соответствии с ее поведением, потому что он будет продолжать делать то, что делал, независимо от того, готовы вы или нет.

Примерно в 75-80% случаев он активно подталкивал к экрану. Какие частоты кадров вы могли бы достичь, если бы вы делали то же самое?

Это 80% времени было также тем, что ЦП должен был обрабатывать пользовательский ввод, вычислять игровое состояние и загружать спрайты / тайлы в области VRAM, которые в данный момент находились вне экрана (или, по крайней мере, не включены в текущую нарисованную линию).

20% между кадрами - это все, что ЦПУ должен был настроить параметры видео или ОЗУ, которые влияют на весь следующий кадр.

В конце каждой строки графический процессор посылает прерывание синхронизации строки в ЦП. Это прерывание можно использовать для настройки параметров нескольких спрайтов или нескольких фоновых слоев (именно так можно получить эффект, подобный коническому прожектору, изменив размер и расположение одной из прямоугольных масок между каждой нарисованной линией. Что касается аппаратного обеспечения, все эти области являются прямоугольными.) Вы должны быть осторожны, чтобы эти обновления были небольшими и заканчивались до того, как графический процессор начнет рисовать следующую строку, иначе вы можете получить неприятные результаты. Любое время, потраченное на обработку этих прерываний, также сокращает 80% времени процессора ...

Для игр, которые получили максимальную отдачу от этой системы, ни процессор, ни графический процессор никогда не делали настоящий перерыв; каждый гнался за другим по кругу, обновляя то, на что другой в данный момент не смотрел.


5
Добро пожаловать и хорошо поставлено.
Миндвин

2
Некоторые «более новые» системы, такие как Nintendo DS, обошли ограничение фиксированной частоты кадров, добавив регистр VCOUNT, чтобы задержать следующий кадр на настраиваемое время (обычно для синхронизации многопользовательских игр).
лес

21

Ключевой особенностью всех игровых приставок, которая отличала их от ранних ПК и практически всех домашних компьютеров (1), были аппаратные спрайты .

В связанном руководстве по программированию GBA показано, как они работают с точки зрения основного процессора. Растровые изображения, представляющие игрока, фон, врагов и т. Д. Загружаются в одну область памяти. Другая область памяти определяет местоположение спрайтов. Таким образом, вместо того, чтобы перезаписывать всю видеопамять на каждый кадр, что требует много инструкций, процессор просто должен обновить местоположение спрайтов.

Затем видеопроцессор может работать попиксельно, чтобы определить, какой спрайт рисовать в этой точке.

Однако для этого требуется двухпортовая оперативная память, совместно используемая двумя, и я думаю, что в GBA видеопроцессор находится на том же чипе, что и основной ARM и вторичный процессор Z80.

(1) Заметное исключение: Amiga


Только гадость - у действительно ранних аркадных игр были спрайты в ПЗУ, связанные с графическим процессором, а не двухпортовый ОЗУ. Я понятия не имею, было ли это так и в случае с ранними консолями, хотя, конечно, это можно было бы сделать таким образом.
Тим Уэскотт

@TimWescott GBA имел несколько режимов рисования, и у меня нет опыта работы с большинством, так что это не всегда так, но я не думаю, что какой-либо из этих режимов имел прямой доступ к ПЗУ (на картридже): как правило, все Данные тайла / спрайта / палитры должны были быть перенесены из ПЗУ в видеопамять, и графический процессор обработал их оттуда.
Мистер Миндор

@ Mr.Mindor Извините, если мне неясно - я не претендую на знания о том, как это сделали GB или GBA. Я только что прокомментировал действительно ранние аркадные игры Nintendo еще в конце 70-х и начале 80-х, которые заставили всех нас задуматься, как, черт возьми, они это сделали .
Тим Уэскотт

@TimWescott: я думаю, что то же самое было и в отношении NES, хотя рассматриваемое ПЗУ находилось в пакете Game Paks.
суперкат

19

«Мой вопрос - как такое устройство, как GBA, достигло частоты кадров почти 60 кадров в секунду?»

Чтобы ответить только на вопрос, они сделали это с графическим процессором. Я уверен, что Game Boy использовал спрайт графику. На верхнем уровне это означает, что графический процессор загружает такие вещи, как изображение фона, изображение Марио, изображение принцессы Пич и т. Д. Затем главный процессор выдает команды типа «показать смещение фона этим в основном по x и y, наложение изображения № 3 Mario в этой позиции x, y "и т. д. Таким образом, основной процессор абсолютно положительно не связан с прорисовкой каждого пикселя, а графический процессор абсолютно положительно не связан с вычислением состояния игра. Каждый оптимизирован для того, что ему нужно делать, и в результате получается довольно хорошая видеоигра без большой вычислительной мощности.


7
Называя его «графический процессор», преувеличивает то, что он делает, предполагая, что это своего рода процессор. Это просто видеоконтроллер, который представляет собой сложный вид секвенсора. При подсчете количества пикселей по горизонтали и вертикали он выбирает данные заголовка и / или спрайта, помещает их в регистры сдвига и объединяет выходные данные регистров сдвига в выходной пиксель. Он не способен запускать программы, подобные графическому процессору "GPU".
Росс Ридж

14

У GBA был довольно медленный процессор. ARM7 очень хорош; они просто запускали его медленно и почти ничего не давали.

Есть причина, по которой многие игры Nintendo в то время и раньше были сторонними скроллерами. HARDWARE. Все сделано аппаратно. У вас было несколько слоев листов плюс один или несколько спрайтов, и аппаратное обеспечение выполнило всю работу по извлечению пикселей из этих таблиц и управлению дисплеем.

Вы строите плитку, установленную спереди, и затем у вас была небольшая память, которая была картой плиток. Хотите, чтобы нижняя левая плитка была плиткой 7? Вы помещаете 7 в эту ячейку памяти. Хотите, чтобы следующая плитка была плиткой 19? В наборе плиток вы помещаете туда 19 и так далее для каждого включенного слоя. Для спрайта вы просто устанавливаете адрес x / y. Вы также можете выполнить масштабирование и поворот, установив некоторые регистры, а остальное позаботится оборудование.

Режим 7, если я правильно помню, был пиксельным режимом, но это было похоже на традиционную видеокарту, где вы помещаете байты в цвет обложки для пикселя, а аппаратное обеспечение заботится об обновлении видео. Я думаю, что вы могли бы пинг-понг или, по крайней мере, когда у вас был новый кадр, вы могли бы перевернуть их, но я не помню, правильно. Опять же, процессор был достаточно разогнан для того времени и не имел слишком много быстрых ресурсов. Поэтому, хотя некоторые игры были в режиме 7, многие из них были скроллерами на основе тайлов ...

Если вам нужно решение с высокой частотой кадров, вам нужно спроектировать это решение. Вы не можете просто взять любой старый дисплей и поговорить с ним через SPI или I²C или что-то в этом роде. Поместите по крайней мере один кадровый буфер перед ним, в идеале два, и по возможности управляйте строками и столбцами на этом дисплее.

На некоторых дисплеях, которые, как я подозреваю, вы покупаете, есть контроллер, с которым вы на самом деле разговариваете. Если вам нужна производительность типа GBA / console, вы создаете / внедряете контроллер. Или вы покупаете / строите с графическим процессором / видеочипом / логическим блоком и используете HDMI или другой общий интерфейс в штатном мониторе.

Тот факт, что у велосипеда есть шины, цепь и механизмы, не означает, что он может двигаться так же быстро, как мотоцикл. Вам необходимо спроектировать систему для удовлетворения ваших потребностей в производительности, от начала до конца. Вы можете поставить велосипедное колесо на этот мотоцикл, но оно не будет работать так, как нужно; Все компоненты должны быть частью общего дизайна.

Астероиды работали так же; ему нужен был только один 6502. Векторная графика была сделана с отдельной логикой; 6502 отправил крошечную строку данных в контроллер векторной графики, который использовал ПЗУ и эти данные для построения графика xy луча и z, вкл / выкл ... В некоторых режимах были отдельные процессоры для обработки аудио и видео отдельно от процессор, вычисляющий игру. Конечно, сегодня видео обрабатывается несколькими сотнями, если не тысячами процессоров, которые отделены от основного процессора ...


Клянусь, я помню, что mode7 стал предметом маркетинга в ответ на "гиперрежим" Sega или что-то в этом роде ... может быть, "Super FX?" ru.wikipedia.org/wiki/Mode_7
Калеб Джей

coranac.com/tonc/text/bitmaps.htm#sec-modes Возможно, я запомнил это неправильно. Я имею в виду, может быть, режим 5 или один из режимов растрового изображения, есть несколько режимов листов со спрайтами и режимом растрового изображения / кадрового буфера или режимами , может быть, 7. не знал о том, кого вы связали, но это хорошо знать.
old_timer

хм, читая больше о режиме 7, и это не просто режим. В любом случае GBA имеет режимы листов и режимы растровых изображений, которые работают медленнее, поскольку вы должны нести ответственность за каждый пиксель, где режимы листов, один байт в карте листов, дают много пикселей. Они также использовали размер шин (ширину) и скорость памяти, а также функцию кэширования в конвейере, чтобы помочь вывести вещи (инструкции) из памяти немного быстрее. Но с самого первого дня вы боролись за то, чтобы программное обеспечение работало с приличной скоростью, и, к счастью, логика позаботилась о большинстве видео работ.
old_timer

если вы посмотрите на эти дисплеи, которые вы покупаете, которые имеют эти параллельные 8-битные или 4-битные интерфейсы или интерфейсы spi или i2c, которые вам мешают для производительности, вам нужен необработанный дисплей без этих контроллеров, а затем вы можете контролировать управление дисплеем Создайте фреймбуфер или два, чтобы вы могли пинг / понг и быстрый интерфейс от вашего процессора до фреймбуфера. Предполагая, что вы начинаете с достаточно быстрого дисплея в первую очередь.
old_timer

7

как такое устройство, как GBA, достигло частоты кадров почти 60 кадров в секунду?

Аппаратные средства.

Он имеет графическую память, которая может или не может использовать ту же шину, что и память для программ / данных ... но важный момент заключается в том, что он имеет графический процессор, который считывает память 60 раз в секунду и отправляет данные на ЖК-дисплей с помощью оптимизированный интерфейс, который разработан, чтобы сделать это эффективно.

Вы можете сделать то же самое с любым современным микроконтроллером, оснащенным периферийным устройством с «ЖК-интерфейсом», например LPC4330, хотя это может быть излишним. Конечно, вам понадобится совместимая ЖК-панель.

С современными быстрыми микроконтроллерами (т.е. ARM, а не AVR) и таким крошечным экраном вам, вероятно, не понадобятся спрайты или блистер для ускорения графических операций. С 8-битным AVR это может быть медленным.

Но неважно, что процессор, битный интерфейс интерфейса к дисплею, будет отстойным.

Я полагаю, что Atari 2600 использовал процессорные биты для отправки изображения на телевизор. Это немного устарело.


Даже у 2600 были аппаратные спрайты, хотя их было очень ограниченное количество (два игрока и две пули, я думаю)
pjc50

2
@ pjc50, то Atari 2600 родов имели аппаратные спрайты. Как и любая другая часть графической подсистемы, они были одномерными объектами. Если программист хотел чего-то другого, кроме набора вертикальных линий, программе необходимо было обновить спрайты после того, как каждая строка была выведена на экран.
Марк

1
@Mark: 2600 определенно имели аппаратные спрайты. Аппаратное обеспечение контролировало только горизонтальное позиционирование, но спрайты на 2600 позволили играм создавать игры, которые были намного красочнее, чем у любого из его конкурентов.
суперкат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.