← На главную

В NES картинка дрожит из-за архитектуры PPU

05.07.2026 21:45 · hackernews

Знаете, почему картинка на NES через композитный видеовыход слегка «дрожит»? Автор разбирается в причинах. Сразу отбрасываем версию с помехами — они случайны, а джиттер на NES повторяется циклично и привязан к изображению (посмотрите на букву B из Mighty Bomb Jack: пиксели на границе белого и синего «плывут» предсказуемо каждые три строки).

Вторая гипотеза — цветовая поднесущая (colorburst). Её частота 3.57 МГц выбрана так, чтобы на каждую строку приходилось 227.5 циклов — нецелое число. Это сделано специально, чтобы упростить фильтрацию цвета. Автор сравнивает NES с Apple II: у Apple частота строки изменена, и там 228 циклов — картинка стабильнее. Японская Sega Master System тоже выдаёт 228 циклов, и артефакты там заметны только при скроллинге (как земля в Alex Kidd). А вот PC Engine использует «правильные» 227.5 — и всё равно картинка не идеальна, потому что композит заточен под реальный мир, а не под компьютерную графику.

Главная проблема NES — в архитектуре. В отличие от большинства консолей конца 80-х, Famicom не использует промежуточный RGB-сигнал. PPU (Picture Processing Unit) напрямую генерирует композит. Внутри стоит кварцевый генератор на 21.47727 МГц — ровно в шесть раз больше частоты цветовой поднесущей. От него PPU получает 12 возможных фаз цвета. Делим этот генератор на 4 — получаем пиксельную частоту 5.369 МГц. Строка содержит 341 пиксель. И тут фокус: одна строка «влезает» не в 227.5, а в 227.33 цикла цветовой поднесущей. Отсюда трёхстрочный паттерн.

Но на экране видны только два положения, а не три. Инженеры Ricoh применили «ленивое» чересстрочное развёртывание: последняя строка кадра меняет длину с 341 на 340 пикселей («пропущенная точка»). Это сдвигает фазу и оставляет только два из трёх возможных выравниваний, которые чередуются каждый кадр. В результате — эффект, похожий на нормальный 227.5-цикловый режим. Всё это верно только для NTSC-версии; PAL-консоль устроена иначе.

Исключение — редкий трюк с отключением рендеринга. Если PPU не рисует фон и спрайты, «пропущенная точка» не используется. Battletoads от Rare выключает рендеринг каждый кадр ради доступа к CHR-RAM — и тогда трёхстрочный паттерн возвращается, как и было задумано изначально.

Читать оригинал →