Конфликт атрибутов

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Конфликт атрибутов на MSX 1

Конфликт атрибутов или клэшинг (англ. attribute clash) — артефакт графики, проявляющийся на старых домашних компьютерах и связанный с аппаратными ограничениями. Наиболее известен пользователям ZX-Spectrum.

Деловые компьютеры, в противовес домашним, сужали цветовую палитру, но не допускали подобных ограничений; в любой пиксель можно было писать любой цвет из N. CGA имел всего 4 цвета, а Apple Macintosh был вообще монохромным.

Причина[править | править код]

Статичная картинка, выполненная с учётом структуры видеопамяти Spectrum’а

Для экономии памяти и ускорения работы первые цветные компьютеры не позволяли присваивать любому пикселю любой цвет. Вместо этого экран делился на блоки, и каждому блоку давались два цвета — передний план и фон. В каждом из блоков пиксель имел один из этих двух цветов (и кодировался одним битом). При попытке вывести три цвета в один блок один из этих трёх цветов теряется, приводя к специфическим артефактам[1].

В частности, ZX-Spectrum каждому знакоместу размером 8×8 пикселей присваивал 1-байтовый атрибут — трёхбитовый цвет переднего плана INK, трёхбитовый цвет фона PAPER, 1 бит яркости BRIGHT и 1 бит мигания FLASH[2][3]. Это давало 15 цветов (только на отдельных комбинациях «видеоконтроллер+телевизор» чёрный как-то отличим от ярко-чёрного)[3]. Таким образом, при разрешении 256×192 видеопамять занимала всего 6912 байтов[2][3]. К слову сказать, эффект мигания использовался крайне редко в том числе и из-за того, что мигающая область явно состоит из квадратных блоков.

В MSX 1 атрибут присваивается горизонтальным блокам 8×1 пикселей. Кроме того, были аппаратные спрайты, не конфликтовавшие друг с другом и с фоном. Впрочем, при портировании с ZX-Spectrum байт атрибута зачастую размножали, а спрайтами не пользовались, что приводило к практически неотличимой игре. В NES конфликтная зона 8×8 пикселей — но с аппаратными спрайтами, аппаратной же прокруткой и широкой палитрой (всего 52 цвета, одновременно 8 палитр по 3 цвета + базовый[4]) это малозаметно.

Статичные картинки, естественно, строятся с учётом ограничений видеопамяти. В играх изображение строится динамически, и с проблемой требуется как-то бороться.

Способы борьбы[править | править код]

1. Использовать атрибут фона[править | править код]

Saboteur!: жёлтый и голубой цвета обставлены как освещение
Terramex: менее удачный пример. И вообще здесь никто и не пытался скрыть квадратики знакомест.

Это самый простой в программировании метод — программист только управляет пикселями, не трогая плоскость атрибутов. В таком случае нет и цветного «кирпича», но спрайт теряется на фоне (Double Dragon[1][5]).

Чтобы этот метод давал качественные результаты, выработали особый стиль (Saboteur!, Bomb Jack, Cyclone, Strike Force Cobra). Оформление игры основывается на чёрном цвете, чёрный цвет практически везде: в узорах стен, в декорациях, в одежде врагов… Нечёрный же цвет играет роль освещения: например, чёрный ниндзя, бегущий вдоль жёлтой стены, становится чёрно-жёлтым, на фоне синего неба тот же ниндзя чёрно-синий. Конфликт будет, если в каком-то знакоместе отказались от чёрного цвета (спинки стульев в Saboteur II: Avenging Angel).

+: интересный визуальный стиль; цветное изображение сочетается с незначительными артефактами; никакого управления атрибутами.

: требует, чтобы персонажи были чёрными, с минимумом светлых линий, а фон чёрно-цветным. Если это не так, знакоместа будут явно видны.

2. Использовать атрибут спрайта[править | править код]

Three Weeks in Paradise: жёлтый Уолли сделал жёлтой траву поблизости.

Спрайт распространяет свой атрибут на фон, что приводит к цветному «кирпичу», который следует за героем. Этот механизм применяется нечасто, обычно только для главного героя, но не для врагов — например, Pac-Mania[6] или серия игр про Уолли (Everyone's a Wally и др.)

+: спрайт отделяется цветом от заднего плана; никаких ограничений стиля или движения.

: артефакты чётко видны.

3. Сплошной фон, цветные спрайты[править | править код]

Zynaps: игра в чёрном космосе

Один из самых популярных способов. Фон окрашивается в один цвет (чаще всего чёрный), с минимумом оформления, а геймплей строится так, чтобы вероятность столкновения двух объектов разных цветов была минимальной. Большинство элементов уровня непроходимы и конфликта не вызывают; немногие проходимые или являются передним планом и перекрывают спрайты (Exolon, Rex), или распространяют свой атрибут на спрайт (Dizzy).

Этим способом отображается большинство игр типа «лабиринт»: Manic Miner[5], серия Monty, Abu Simbel Profanation, Cybernoid, Into The Eagle's Nest. Также характерен для космических скролл-шутеров (Zynaps, R-Type), так как чёрный фон с небольшим количеством точек хорошо подходит для изображения космоса.

+: крайняя простота.

: скудное графическое оформление фона.

4. Двухцветное изображение[править | править код]

Athena: монохромное чёрно-голубое игровое поле

В пределах игрового поля всё изображение становится двухцветным (Elite, Chimera, Head Over Heels, Robocop, Quazatron, Terra Cresta). Впрочем, цвет, в который окрашено игровое поле, также может нести какую-либо информацию. В игре Robocop это разные уровни, в Quazatron это разные локации, в Terra Cresta это зоны в пределах уровня. Часто (Draconus, Turbo Esprit) основная часть изображения двухцветная, и только некоторые важные объекты отрисованы другими цветами.

Таким способом отрисовывается большинство псевдо-3D (гонки) и изометрических игр.

+: полное отсутствие артефактов; никаких ограничений на движение; никакого управления атрибутами.

: теряется возможность рисовать в цвете.

5. Выравнивание спрайтов по знакоместам[править | править код]

Laser Squad: каждая клетка — 2×2 знакоместа

Шаг движения спрайтов ограничивается 8-пиксельной сеткой. Этот способ хорошо подходит для игр, не требующих динамичной отрисовки сцен (стратегии, логические игры), но применяется и для динамичных игр — так добились быстрой игры Centipede[5]. Движение спрайтов и прокрутка фона с шагом в 8 пикселей хорошо заметны в играх Savage, Astro Marine Corps, Dan Dare III, Extreme.

Этот механизм не всегда помогает, и часто дополняется другими методами. Например, в играх Trapdoor и Flunky применяются крупные спрайты со сплошной заливкой цветом, при этом крупное изображение, находящееся на заднем плане, передаёт свой цвет в цвет фона переднего спрайта.

В некоторых случаях применяется так называемое вытеснение спрайтов, когда в одном знакоместе 8×8 отрисовывается только один спрайт (и, возможно, фон). В играх Savage и Astro Marine Corps передний спрайт полностью вытесняет задний. Вытеснение спрайтов очень заметно в игре Golden Axe, что портит общее впечатление от графики игры.

+: простота; один только этот шаг серьёзно снижает артефакты.

: не всегда пригодно, в динамичных играх приводит к движению рывками.

6. Динамическое изменение атрибутов[править | править код]

Картинка в нетрадиционном режиме Spectrum’а

Некоторые демо-ролики динамически меняют атрибуты, синхронизируясь со строчной развёрткой монитора. Конфликты не исчезают, но конфликтная зона уменьшается до 8×1 пикселей.

+: попытка обойти ограничения видеопамяти.

: способ отнимает много процессорного времени.

Примечания[править | править код]

  1. 1 2 Arcade Colour, Illustration and Attribute Clash 1979 - 89 | David Surman - Academia.edu. Дата обращения: 23 июня 2022. Архивировано 23 июня 2022 года.
  2. 1 2 L Break Into Program - ZX Spectrum Screen Memory Layout. Дата обращения: 23 июня 2022. Архивировано 3 июля 2022 года.
  3. 1 2 3 The ZX-Spectrum screen layout: Part I – Overtaken by events. Дата обращения: 23 июня 2022. Архивировано 31 марта 2022 года.
  4. PPU palettes - NESdev Wiki. Дата обращения: 23 июня 2022. Архивировано 29 мая 2022 года.
  5. 1 2 3 Colour Clash: The Engineering Miracle of the Sinclair ZX Spectrum — Paleotronic Magazine. Дата обращения: 23 июня 2022. Архивировано 18 мая 2022 года.
  6. Три самых навороченных Пакмана на ZX Spectrum? - YouTube. Дата обращения: 27 июня 2022. Архивировано 27 июня 2022 года.