Я разрабатывал свое собственное портативное игровое устройство на основе микроконтроллера 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!
источник
Ответы:
Другие ответы довольно хорошо охватывают ваш вопрос на абстрактном уровне (аппаратное обеспечение), но, имея конкретный опыт работы с GBA, в частности, я подумал, что более подробное объяснение может стоить того.
У GBA было много режимов рисования и настроек, которые можно было использовать для управления интерпретацией графическим процессором видеопамяти, но одно было неизбежно: частота кадров. Графический процессор рисовал на экране почти (подробнее об этом ниже). (Это, вероятно, самый важный бит для вашего вопроса.)
Он будет рисовать одну линию за раз, делая очень короткий перерыв между ними. После отрисовки последней линии для кадра потребуется перерыв, примерно равный времени, необходимому для отрисовки 30 линий. Тогда начни снова. Время каждой строки и время каждого кадра были заранее определены и установлены в камне. Во многих отношениях графический процессор действительно был хозяином этой системы, и вам нужно было создавать свои игры в соответствии с ее поведением, потому что он будет продолжать делать то, что делал, независимо от того, готовы вы или нет.
Примерно в 75-80% случаев он активно подталкивал к экрану. Какие частоты кадров вы могли бы достичь, если бы вы делали то же самое?
Это 80% времени было также тем, что ЦП должен был обрабатывать пользовательский ввод, вычислять игровое состояние и загружать спрайты / тайлы в области VRAM, которые в данный момент находились вне экрана (или, по крайней мере, не включены в текущую нарисованную линию).
20% между кадрами - это все, что ЦПУ должен был настроить параметры видео или ОЗУ, которые влияют на весь следующий кадр.
В конце каждой строки графический процессор посылает прерывание синхронизации строки в ЦП. Это прерывание можно использовать для настройки параметров нескольких спрайтов или нескольких фоновых слоев (именно так можно получить эффект, подобный коническому прожектору, изменив размер и расположение одной из прямоугольных масок между каждой нарисованной линией. Что касается аппаратного обеспечения, все эти области являются прямоугольными.) Вы должны быть осторожны, чтобы эти обновления были небольшими и заканчивались до того, как графический процессор начнет рисовать следующую строку, иначе вы можете получить неприятные результаты. Любое время, потраченное на обработку этих прерываний, также сокращает 80% времени процессора ...
Для игр, которые получили максимальную отдачу от этой системы, ни процессор, ни графический процессор никогда не делали настоящий перерыв; каждый гнался за другим по кругу, обновляя то, на что другой в данный момент не смотрел.
источник
Ключевой особенностью всех игровых приставок, которая отличала их от ранних ПК и практически всех домашних компьютеров (1), были аппаратные спрайты .
В связанном руководстве по программированию GBA показано, как они работают с точки зрения основного процессора. Растровые изображения, представляющие игрока, фон, врагов и т. Д. Загружаются в одну область памяти. Другая область памяти определяет местоположение спрайтов. Таким образом, вместо того, чтобы перезаписывать всю видеопамять на каждый кадр, что требует много инструкций, процессор просто должен обновить местоположение спрайтов.
Затем видеопроцессор может работать попиксельно, чтобы определить, какой спрайт рисовать в этой точке.
Однако для этого требуется двухпортовая оперативная память, совместно используемая двумя, и я думаю, что в GBA видеопроцессор находится на том же чипе, что и основной ARM и вторичный процессор Z80.
(1) Заметное исключение: Amiga
источник
«Мой вопрос - как такое устройство, как GBA, достигло частоты кадров почти 60 кадров в секунду?»
Чтобы ответить только на вопрос, они сделали это с графическим процессором. Я уверен, что Game Boy использовал спрайт графику. На верхнем уровне это означает, что графический процессор загружает такие вещи, как изображение фона, изображение Марио, изображение принцессы Пич и т. Д. Затем главный процессор выдает команды типа «показать смещение фона этим в основном по x и y, наложение изображения № 3 Mario в этой позиции x, y "и т. д. Таким образом, основной процессор абсолютно положительно не связан с прорисовкой каждого пикселя, а графический процессор абсолютно положительно не связан с вычислением состояния игра. Каждый оптимизирован для того, что ему нужно делать, и в результате получается довольно хорошая видеоигра без большой вычислительной мощности.
источник
У GBA был довольно медленный процессор. ARM7 очень хорош; они просто запускали его медленно и почти ничего не давали.
Есть причина, по которой многие игры Nintendo в то время и раньше были сторонними скроллерами. HARDWARE. Все сделано аппаратно. У вас было несколько слоев листов плюс один или несколько спрайтов, и аппаратное обеспечение выполнило всю работу по извлечению пикселей из этих таблиц и управлению дисплеем.
Вы строите плитку, установленную спереди, и затем у вас была небольшая память, которая была картой плиток. Хотите, чтобы нижняя левая плитка была плиткой 7? Вы помещаете 7 в эту ячейку памяти. Хотите, чтобы следующая плитка была плиткой 19? В наборе плиток вы помещаете туда 19 и так далее для каждого включенного слоя. Для спрайта вы просто устанавливаете адрес x / y. Вы также можете выполнить масштабирование и поворот, установив некоторые регистры, а остальное позаботится оборудование.
Режим 7, если я правильно помню, был пиксельным режимом, но это было похоже на традиционную видеокарту, где вы помещаете байты в цвет обложки для пикселя, а аппаратное обеспечение заботится об обновлении видео. Я думаю, что вы могли бы пинг-понг или, по крайней мере, когда у вас был новый кадр, вы могли бы перевернуть их, но я не помню, правильно. Опять же, процессор был достаточно разогнан для того времени и не имел слишком много быстрых ресурсов. Поэтому, хотя некоторые игры были в режиме 7, многие из них были скроллерами на основе тайлов ...
Если вам нужно решение с высокой частотой кадров, вам нужно спроектировать это решение. Вы не можете просто взять любой старый дисплей и поговорить с ним через SPI или I²C или что-то в этом роде. Поместите по крайней мере один кадровый буфер перед ним, в идеале два, и по возможности управляйте строками и столбцами на этом дисплее.
На некоторых дисплеях, которые, как я подозреваю, вы покупаете, есть контроллер, с которым вы на самом деле разговариваете. Если вам нужна производительность типа GBA / console, вы создаете / внедряете контроллер. Или вы покупаете / строите с графическим процессором / видеочипом / логическим блоком и используете HDMI или другой общий интерфейс в штатном мониторе.
Тот факт, что у велосипеда есть шины, цепь и механизмы, не означает, что он может двигаться так же быстро, как мотоцикл. Вам необходимо спроектировать систему для удовлетворения ваших потребностей в производительности, от начала до конца. Вы можете поставить велосипедное колесо на этот мотоцикл, но оно не будет работать так, как нужно; Все компоненты должны быть частью общего дизайна.
Астероиды работали так же; ему нужен был только один 6502. Векторная графика была сделана с отдельной логикой; 6502 отправил крошечную строку данных в контроллер векторной графики, который использовал ПЗУ и эти данные для построения графика xy луча и z, вкл / выкл ... В некоторых режимах были отдельные процессоры для обработки аудио и видео отдельно от процессор, вычисляющий игру. Конечно, сегодня видео обрабатывается несколькими сотнями, если не тысячами процессоров, которые отделены от основного процессора ...
источник
Аппаратные средства.
Он имеет графическую память, которая может или не может использовать ту же шину, что и память для программ / данных ... но важный момент заключается в том, что он имеет графический процессор, который считывает память 60 раз в секунду и отправляет данные на ЖК-дисплей с помощью оптимизированный интерфейс, который разработан, чтобы сделать это эффективно.
Вы можете сделать то же самое с любым современным микроконтроллером, оснащенным периферийным устройством с «ЖК-интерфейсом», например LPC4330, хотя это может быть излишним. Конечно, вам понадобится совместимая ЖК-панель.
С современными быстрыми микроконтроллерами (т.е. ARM, а не AVR) и таким крошечным экраном вам, вероятно, не понадобятся спрайты или блистер для ускорения графических операций. С 8-битным AVR это может быть медленным.
Но неважно, что процессор, битный интерфейс интерфейса к дисплею, будет отстойным.
Я полагаю, что Atari 2600 использовал процессорные биты для отправки изображения на телевизор. Это немного устарело.
источник