17710535830256-png.7467


Автор: [TapeLoader]
Специально для журнала «РетроКом»


🤯 Пролог. Когда 3D — это очень и очень медленно​

2024 год. Инженер Google из Цюриха Габриэль Гамбетта задаётся вопросом: «А что, если…».

Что, если взять 42-летний компьютер с процессором, который в 1000 раз медленнее современного, с памятью 48 килобайт, 15 цветами на экране и атрибутным конфликтом, превращающим графику в «кашу» — и заставить его делать трассировку лучей? Ту самую технологию, которая сегодня требует видеокарт за тысячи долларов и греет комнату лучше любого обогревателя?

Ответ, который он получил, заставил его «смотреть в недоумении целую минуту» .

Но главный вопрос нашей статьи — Сколько времени займёт рендеринг одной 3D-сцены на ZX Spectrum? И можно ли вообще говорить о «кадрах в секунду», когда счёт идёт на часы?

Спойлер: можно. Если вы готовы измерять производительность в кадрах в месяц.

🧠 Трассировка лучей: что это вообще такое?​

Прежде чем мы погрузимся в безумные цифры, давайте разберёмся, что такое трассировка лучей (ray tracing).

Это метод рендеринга, который позволяет изображать свет и тени максимально реалистично. Алгоритм «выстреливает» лучи из камеры через каждый пиксель экрана и вычисляет, с какими объектами они сталкиваются, как отражаются, преломляются и создают тени .

Сегодня эта технология — стандарт для топовых игр. Nvidia RTX, AMD Radeon RX — всё это железо, заточенное под трассировку лучей в реальном времени.

А в 1982 году, когда вышел ZX Spectrum, трассировка лучей существовала только в университетских лабораториях и требовала мейнфреймов. Никто в здравом уме не пытался запустить её на домашнем компьютере за 175 фунтов.

Никто, кроме безумцев. Безумцев, которые через 40 лет всё-таки это сделали.

🔬 Эксперимент Габриэля Гамбетты​

Габриэль Гамбетта — автор книги "Computer Graphics from Scratch" и старший инженер Google в Цюрихе. Но, что важнее, он вырос на ZX Spectrum в Уругвае . И однажды он решил совместить свою ностальгию с профессиональными знаниями.

Инструментарий​

Для эксперимента потребовалось:
  • Язык: Sinclair BASIC — единственный язык, который понимает Spectrum «из коробки» .
  • Среда разработки: VSCode (на современном PC) .
  • Конвертер: BAS2TAP — преобразует текст в образ аудиокассеты .
  • Эмулятор: FUSE — для запуска и тестирования .
Гамбетта портировал код своего "Tiny Raytracer" (который в оригинале занимал 912 байт JavaScript) в Бейсик Spectrum'а. И начал тесты.

Первый результат: 32×22 пикселя​

Первая попытка была скромной. Гамбетта ограничился разрешением 32×22 пикселя. Почему так мало? Потому что экран Spectrum организован хитро: есть bitmap (один бит на пиксель) и область атрибутов (один байт на блок 8×8 пикселей, задающий два цвета — INK и PAPER) .

На таком разрешении каждый «пиксель» в渲染е соответствовал целому блоку 8×8 настоящих пикселей. Это позволило избежать атрибутного конфликта ценой детализации.

Результат: Изображение трёх цветных сфер. Время рендеринга: 15 минут .

Уже неплохо. 15 минут на один кадр. Частота: 0.0011 кадра в секунду.

Второй результат: 256×176 (почти полный экран)​

Но Гамбетта не успокоился. Он решил поднять разрешение до почти максимального — 256×176 пикселей. И тут в игру вступил атрибутный конфликт во всей красе.

Алгоритм пришлось усложнить: для каждого блока 8×8 определялись два самых популярных цвета, и ими закрашивался весь блок. Результат получился «очень спектрумовским» — с характерными «разводами» там, где встречаются три цвета .

Результат: Время рендеринга: 17 часов .

17 часов. Один кадр. Частота: 0.000016 кадра в секунду.

Это уже не смешно. Это абсурдно. Но Гамбетта смотрел на результат «в недоумении целую минуту» . Потому что это работало.

⚡ Оптимизация: можно ли ускорить?​

17 часов — это, мягко говоря, дохрена. Гамбетта занялся оптимизацией.

Хитрости на уровне алгоритма​

Он применил несколько трюков:
  1. Проверка угловых пикселей: Для каждого блока 8×8 сначала вычисляются значения в четырёх углах. Если они совпадают — остальные 60 пикселей закрашиваются тем же цветом без дополнительных расчётов .
  2. Дизеринг (dithering): Для имитации градиентов использовался упорядоченный паттерн 8×8 .
  3. Тени: Добавление источника света и расчёт теней .

Результат оптимизации​

После оптимизации время рендеринга удалось сократить до 2.5 часов . Это уже прогресс: с 17 до 2.5 часов.

Но добавив тени и полноценное освещение, Гамбетта вернулся к тем же 17 часам . Потому что тени требуют дополнительных лучей, а дополнительные лучи — дополнительных вычислений.

Итоговая производительность:
РазрешениеВремяКадров в секундуКадров в час
32×2215 минут0.00114
256×176 (базовый)17 часов0.0000160.058
256×176 (оптимизированный)2.5 часа0.000110.4
256×176 (с тенями)17 часов0.0000160.058

🎬 А что с анимацией?​

Теперь самый интересный вопрос. Если один кадр рендерится 17 часов, сколько времени займёт анимация?

Давайте посчитаем.

Для минимально плавной анимации нужно хотя бы 10 кадров в секунду. Для нормальной — 24-30.

Вариант 1: Один кадр = 17 часов​

  • 10 секунд анимации (10 кадров/сек × 10 сек = 100 кадров) = 1700 часов = 70.8 суток
  • 1 минута анимации (600 кадров) = 10200 часов = 425 суток = 1 год и 2 месяца
  • Полнометражный мультфильм (90 минут = 5400 секунд = 54000 кадров) = 918000 часов = 38250 суток = 104.8 года

Вариант 2: Один кадр = 2.5 часа (оптимизированный, без теней)​

  • 10 секунд анимации = 250 часов = 10.4 суток
  • 1 минута анимации = 1500 часов = 62.5 суток
  • Полнометражный мультфильм = 135000 часов = 5625 суток = 15.4 года

Вариант 3: Гипотетический ассемблер​

Гамбетта писал на Бейсике. Если бы он переписал всё на ассемблере, можно было бы получить ускорение в 10–50 раз .

Допустим, 50× ускорение от Бейсика к ассемблеру. Тогда:
  • Один кадр с тенями: 17 часов → 20.4 минуты
  • 10 секунд анимации: 34 часа
  • 1 минута анимации: 204 часа = 8.5 суток
  • Полнометражный мультфильм: 18360 часов = 765 суток = 2.1 года
Прогресс есть. Но до «реального времени» всё ещё далеко.

🏆 Исторический контекст: как это сравнивается с другими попытками?​

VU-3D (1980-е)​

В комментариях к статье Гамбетты вспомнили программу VU-3D от Psion — один из первых 3D-пакетов для Spectrum . Это был не рендеринг, а каркасная 3D-графика (wireframe), но для своего времени — прорыв.

Sentinel (1986)​

Игра The Sentinel использовала продвинутые для своего времени 3D-алгоритмы. Комментаторы на Hackaday отмечают, что там применялся не ray tracing, а ray casting — упрощённая технология, которая позволяла добиться приемлемой скорости даже на 8-битках .

Elite (1984)​

Классический Elite Дэвида Брэбена использовал каркасную 3D-графику и бегал с приемлемой скоростью (субъективно — несколько кадров в секунду) . Это достигалось за счёт отказа от заливки полигонов и текстур — только линии.

Сравнение с экспериментом Гамбетты показывает пропасть между «игровой» 3D-графикой 80-х и фотореалистичной трассировкой лучей.

🤔 Зачем это всё?​

Сам Гамбетта отвечает на этот вопрос честно и прямо: «Абсолютно бессмысленно, но забавно!» .

Но если копнуть глубже, смысл есть.

Понимание прогресса​

17 часов на один кадр на ZX Spectrum против 60 кадров в секунду в реальном времени на RTX 4090. Разница — в 3.7 миллиарда раз. Такие цифры заставляют осознать, как далеко мы ушли за 40 лет.

Образование​

Гамбетта написал книгу "Computer Graphics from Scratch", которая доступна бесплатно. Его эксперимент — наглядная демонстрация того, что даже на примитивном железе можно реализовать сложные алгоритмы, если понимать математику .

Ностальгия​

Для многих Spectrum был «воротами в программирование». Гамбетта вспоминает: «Ты получал его ради игр, но очень легко случайно скатывался в программирование сам, потому что он загружался не в командную строку, а в то, что мы сегодня назвали бы IDE» .

💭 Эпилог. Так сколько кадров в час?​

Ответ зависит от того, что считать.

Если брать максимальное качество (256×176, тени, заливка, Бейсик) — 0.058 кадра в час. Один кадр за 17 часов.

Если брать оптимизированный вариант — 0.4 кадра в час. Один кадр за 2.5 часа.

Если переписать на ассемблере и пожертвовать качеством — можно получить 3 кадра в час (один кадр за 20 минут).

Но главный вывод не в цифрах. Главный вывод в том, что это вообще возможно.

ZX Spectrum, компьютер 1982 года с процессором 3.5 МГц, способен рендерить сцены с трассировкой лучей. Медленно. Очень медленно. Но способен.

И пока есть такие безумцы, как Габриэль Гамбетта, которые готовы потратить выходные на то, чтобы заставить древнее железо делать то, что ему не снилось — дух Spectrum будет жив.

Даже если на один кадр уходит 17 часов.


📊 Финальная таблица производительности​

РежимВремя на кадрКадров в часКадров в сутки
32×22, базовый Бейсик15 минут496
256×176, Бейсик (с тенями)17 часов0.0581.4
256×176, оптимизированный Бейсик2.5 часа0.49.6
256×176, гипотетический ассемблер20 минут372
Современный PC (RTX 4090)0.016 секунды216 000 0005.1 млрд

🧮 И напоследок: как долго ждать Full HD?​

Для любопытных: если попытаться отрендерить на Spectrum один кадр в разрешении Full HD (1920×1080) с тем же алгоритмом, что давал 17 часов на 256×176...

Площадь экрана в 46 раз больше. Время рендеринга — 17 × 46 = 782 часа = 32.6 суток.

Один кадр. Месяц.

С Новым Годом, Spectrum! Ваш фильм на Blu-ray готов... через 300 лет.


© 2026, журнал «РетроКом». Не пытайтесь повторить это дома. Если только у вас нет 17 свободных часов и огромного желания посмотреть на три шарика.