Автор: [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 — для запуска и тестирования .
Первый результат: 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 часов — это, мягко говоря, дохрена. Гамбетта занялся оптимизацией.Хитрости на уровне алгоритма
Он применил несколько трюков:- Проверка угловых пикселей: Для каждого блока 8×8 сначала вычисляются значения в четырёх углах. Если они совпадают — остальные 60 пикселей закрашиваются тем же цветом без дополнительных расчётов .
- Дизеринг (dithering): Для имитации градиентов использовался упорядоченный паттерн 8×8 .
- Тени: Добавление источника света и расчёт теней .
Результат оптимизации
После оптимизации время рендеринга удалось сократить до 2.5 часов . Это уже прогресс: с 17 до 2.5 часов.Но добавив тени и полноценное освещение, Гамбетта вернулся к тем же 17 часам . Потому что тени требуют дополнительных лучей, а дополнительные лучи — дополнительных вычислений.
Итоговая производительность:
| Разрешение | Время | Кадров в секунду | Кадров в час |
|---|---|---|---|
| 32×22 | 15 минут | 0.0011 | 4 |
| 256×176 (базовый) | 17 часов | 0.000016 | 0.058 |
| 256×176 (оптимизированный) | 2.5 часа | 0.00011 | 0.4 |
| 256×176 (с тенями) | 17 часов | 0.000016 | 0.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 минут | 4 | 96 |
| 256×176, Бейсик (с тенями) | 17 часов | 0.058 | 1.4 |
| 256×176, оптимизированный Бейсик | 2.5 часа | 0.4 | 9.6 |
| 256×176, гипотетический ассемблер | 20 минут | 3 | 72 |
| Современный PC (RTX 4090) | 0.016 секунды | 216 000 000 | 5.1 млрд |
И напоследок: как долго ждать Full HD?
Для любопытных: если попытаться отрендерить на Spectrum один кадр в разрешении Full HD (1920×1080) с тем же алгоритмом, что давал 17 часов на 256×176...Площадь экрана в 46 раз больше. Время рендеринга — 17 × 46 = 782 часа = 32.6 суток.
Один кадр. Месяц.
С Новым Годом, Spectrum! Ваш фильм на Blu-ray готов... через 300 лет.
© 2026, журнал «РетроКом». Не пытайтесь повторить это дома. Если только у вас нет 17 свободных часов и огромного желания посмотреть на три шарика.