Введение
Стыковка атрибутов (также известная как цветовой конфликт или растекание цветов) — это графический артефакт, вызванный ограничениями в графических схемах некоторых 8-битных домашних компьютеров, особенно заметный на ZX Spectrum, где в каждой 8×8 пиксельной плитке можно было использовать только два цвета. Этот эффект также наблюдался в программном обеспечении для MSX и в некоторых играх для Commodore 64. Методы обхода этого ограничения впоследствии стали частью культуры программирования для Spectrum. Аналогичная проблема возникала в "полуграфических режимах" (текстовых режимах с графическими возможностями) компьютеров Color Computer и Dragon, однако эти компьютеры также поддерживали графику без атрибутов и с более высоким разрешением. Ряд игровых консолей того времени использовали видеорежимы, которые накладывали подобные ограничения, но обычно позволяли использовать более двух цветов на плитку: NES (Famicom) имела только один такой режим, также "полуграфический", который позволял использовать четыре цвета на 16×16 "блоке" (состоящем из четырех 8×8 плиток), но до 16 цветов на экране. Super NES поддерживала 16 цветов на плитку и 256 цветов на экране (среди прочих улучшений), что делало этот артефакт гораздо менее заметным, если вообще заметным (за исключением тех, кто занимался программированием этой консоли).
Причины
Конфликт атрибутов на ZX Spectrum был вызван его своеобразной организацией видеопамяти, разработанной таким образом, чтобы минимизировать использование памяти буфера кадров и оптимизировать отображение текста вместо графики. Вместо ограничения цветовой палитры для экономии памяти, конструкция Sinclair хранила растровое изображение пикселей и информацию о цвете в отдельных областях памяти. В то время как растровое изображение определяло состояние отдельных пикселей (включенных или выключенных), информация о цвете (или "атрибуты") соответствовала матрице текстовых символов – 24 строки по 32 столбца – с одним байтом на ячейку символа размером 8x8 пикселей. Этот байт кодировал два 3-битных значения, известные как INK (цвет переднего плана) и PAPER (цвет фона), в соответствии с командами BASIC, используемыми для определения цветовых значений. Два других бинарных значения включались в атрибут: бит BRIGHT, указывающий один из двух уровней яркости для двух цветов, и бит FLASH, который при установке заставлял два цвета меняться местами через регулярные интервалы. Эта схема обеспечивала 15 различных цветов: восемь комбинаций красного, зеленого и синего на двух уровнях яркости (за исключением черного, который выглядел одинаково при обеих яркостях). Таким образом, каждый блок пикселей 8x8 мог содержать только 2 цвета из 15 доступных, причем оба должны были быть либо из "яркой", либо из "неяркой" половины палитры. Попытка добавить третий цвет в область 8x8 пикселей приводила к перезаписи одного из предыдущих цветов. ZX Spectrum использовал 6144 байта для растрового изображения, где один байт представлял восемь пикселей, и 768 байт для цветовых атрибутов. Это давало в общей сложности 6912 байт для всего графического дисплея – относительно небольшой объем для компьютера эпохи Spectrum с "цветными" возможностями. Эта графическая архитектура сохранялась вплоть до более поздних переработок Sinclair и Amstrad Spectrum, вплоть до последней модели Amstrad, ZX Spectrum +3, несмотря на то, что последующие модели содержали 128 КБ оперативной памяти, что снижало необходимость экономии памяти таким образом. Архитектура была сохранена для предотвращения потери обратной совместимости. Атрибуты использовались в различных других компьютерах и консолях, включая Commodore 64, MSX и NES, хотя размер блоков атрибутов и количество цветов в блоке варьировались. Однако с использованием аппаратных спрайтов можно было избежать конфликта атрибутов. Микрокомпьютеры Thomson MO5 и TO7, Oric 1, архитектура MSX 1 и другие системы, основанные на контроллере видеодисплея Texas Instruments TMS9918, демонстрируют очень похожее ограничение: для каждой группы из восьми пикселей по горизонтали доступно только два цвета из 16, что дает аналогичный, но менее выраженный эффект, чем у Spectrum. MSX 1 не имел единственного байта цветового атрибута для всей области 8x8 пикселей, как в случае с Sinclair Spectrum, а имел восемь, по одному байту атрибута для каждой группы 8x1 пикселей. Таким образом, в то время как Spectrum был ограничен одной цветовой парой для квадратной области 8x8 пикселей, MSX 1 был ограничен только одной цветовой парой для "линии" из восьми соседних пикселей. Кроме того, MSX1 мог использовать спрайты, которые не были связаны с проблемами конфликта атрибутов (хотя спрайты MSX 1 имели свои собственные ограничения, такие как монохромность). На практике это техническое преимущество часто не помогало системам MSX 1 создавать лучшие изображения. Проблема MSX 1 заключалась в том, что многие европейские компании, конвертировавшие игры Spectrum на MSX 1, игнорировали все улучшения, которые MSX 1 предлагал по сравнению со Spectrum, и, следовательно, полученные версии MSX 1 имели такое же количество конфликтов атрибутов, как и оригинальные игры Spectrum (Jack the Nipper II: In Coconut Capers является одним из примеров этого). Для облегчения конвертации разработчики программного обеспечения просто копировали единственное значение байта атрибута Spectrum во все восемь соответствующих байтов атрибута MSX 1. По той же причине компании-разработчики программного обеспечения также игнорировали возможности спрайтов MSX 1, и поскольку возможности видеодисплея были в остальном довольно похожи (разрешение 256x192, 16 цветов), обе системы создавали практически идентичные изображения для одной и той же игры. В отличие от этого, японские игры MSX 1 использовали все возможности MSX 1, что часто приводило к более привлекательным играм.
Эффекты
Чтобы избежать конфликта атрибутов, статические графические изображения требовали тщательной проработки. Создание детализированной цветной графики было невозможно, поскольку цвет можно было применять только блоками по 8x8 пикселей. Тщательное проектирование могло давать впечатляющие результаты, как и синхронизация изменения цвета с частотой обновления дисплея – обычно телевизора. Однако создание анимированных изображений было более сложной задачей – существенный недостаток для машины, предназначенной в первую очередь для видеоигр. Если даже один пиксель в блоке 8x8 перекрашивался из-за касания движущегося элемента изображения, то перекрашивался весь блок целиком. Таким образом, детализированная движущаяся графика сопровождалась большими, неприятными ореолами быстро меняющихся цветов.
Обходные пути
Ранние программы просто игнорировали эту проблему. Позже стандартным решением стало использование цвета для статических элементов отображения – таких как декоративная рамка по краям экрана, которая могла включать в себя отображение счета и прочую индикацию, – с меньшей центральной монохромной областью, содержащей всю анимированную графику. Это также ускоряло отрисовку графики, поскольку требовалось обновлять меньшую часть экрана – как меньшую область, так и только информацию о пикселях, оставляя цветную область без изменений. Некоторые игры для Spectrum, например Light Force от FTL, использовали чрезвычайно продуманный графический дизайн для достижения полноцветной движущейся графики, по сути, ограничивая как дизайн элементов на экране, так и траектории их движения границами цветового разрешения 8x8. Движущиеся элементы получались относительно крупными, блочными и квадратными, а их движение было ограничено, но это было не слишком заметно, и возможность увидеть движущуюся полноцветную графику производила огромное впечатление на владельцев Spectrum. Ни один из крупных разработчиков не смог найти универсального решения проблемы конфликта атрибутов, предпочитая использовать метод монохромной графики, когда требовалась быстрая и четкая графика, и полноцветную графику, когда это было возможно. Можно было, тщательно контролируя время, изменять область атрибутов в оперативной памяти в определенные моменты во время отрисовки изображения: позволить аппаратуре нарисовать одну строку, а затем изменить оперативную память атрибутов перед отрисовкой следующей строки, чтобы создать эффект различных атрибутов для каждой строки. Эти изменения требовали программной реализации и были трудоемкими в программировании, поэтому эта техника обычно использовалась для создания спецэффектов. Она также была очень популярна в демосцене.
Проблема и решения
Большинство игр до 1987 года игнорировали конфликт атрибутов. Некоторые более поздние игры, такие как Knight Tyme и Three Weeks in Paradise, позволяли игрокам выбирать между двумя режимами конфликта атрибутов: один игнорировал атрибуты главного персонажа, сливая его с фоном, и наоборот, отдавая приоритет цветовой схеме персонажа над фоновым изображением. Другим способом обхода проблемы было простое использование двухцветной графики, также известной как монохромной, как это было сделано в версии для Spectrum игры Knight Lore в 1984 году. Многие игры использовали полноцветные фоны и "прокрутку персонажа" (когда окружение прокручивалось на восемь пикселей за раз), но монохромные спрайты, фактически прозрачные, как в Double Dragon, были отрисованы таким образом, чтобы выделяться, избегая зависимости от цвета. Многие игры использовали этот метод с плавной прокруткой по пикселям, но конфликт атрибутов, когда элементы одного блока символов "перетекали" в следующий, был хорошо заметен. Ярким (и менее удачным) примером использования полноцветной графики стала версия для Spectrum игры Altered Beast. Игра сильно страдает от конфликта атрибутов. Программист Дон Пристли разработал отличительный стиль для нескольких своих игр, используя крупные, мультяшные спрайты, которые были тщательно спроектированы так, чтобы занимать целые блоки символов, не выглядя при этом излишне угловатыми. Недостатком этой техники было то, что геймплей приходилось разрабатывать с учетом графики, поэтому она не подходила для портов с других платформ. Игры, использовавшие этот метод, включали Popeye, The Trap Door, Through the Trapdoor и Flunky. Другие разработчики, использовавшие подобную технику, включали Майка Синглтона с Dark Sceptre и Gang of Five с Dan Dare: Pilot of the Future. В 1994 году программист Игорь Мазница разработал многопроцессорную концептуальную платформу "ZX Poly" на базе ZX Spectrum 128; эта платформа позволяет избежать конфликта атрибутов и даже раскрашивать многие старые игры без изменений в исполняемом коде.