Кіріспе

Атрибуттар қақтығысы (түстер қақтығысы немесе түс ағуы деп те аталады) – кейбір түсті 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-дағы атрибуттар қақтығысы оның ерекше дисплейлік жадының орналасуынан туындады, ол кадр буферінің жадты пайдалануын азайту және графика емес, мәтін көрсетілуін оңтайландыру үшін жасалған. Жадты үнемдеу үшін түстер палитрасын шектеудің орнына, Синклер дизайны пикселдік бит картасы мен түс туралы ақпаратты жадтың бөлек аймақтарында сақтады. Бит картасы жеке пикселдердің күйін (қосулы немесе өшірілген) көрсеткенмен, түс туралы ақпарат (немесе "атрибуттар") 32 бағаннан тұратын 24 қатарлы мәтіндік таңбалар матрицасына сәйкес келді – 8x8 пикселдік таңбалар ұяшығына бір байт. Бұл байт екі 3 биттік мәнді кодтады, олар INK (алдыңғы түс) және PAPER (артқы түс) деп аталады, бұл түс мәндерін анықтау үшін BASIC командаларынан кейін берілген атаулар. Атрибутқа тағы екі екілік мән енгізілген: екі түстің біреуін көрсететін BRIGHT биті (жарық деңгейі) және FLASH биті, ол қосылғанда екі түс белгілі бір интервалмен ауысып тұрады. Бұл схема 15 түрлі түс ұсынды: екі жарық деңгейіндегі қызыл, жасыл және көк түстердің сегіз комбинациясы (қара түс екі жарық деңгейінде де бірдей көрінеді). Осылайша, әрбір 8x8 пикселдік блок 15 қолжетімді түстің тек 2-ін ғана қамтуы мүмкін, олардың екеуі де палитраның жарық немесе жарық емес бөлігінен болуы керек. 8x8 пикселдік аймаққа үшінші түс қосуға тырысылса, бұрынғы түстердің бірі жаңа түспен жазылып шығарылады. ZX Spectrum бит картасы үшін 6144 байт (бір байт сегіз пикселді білдіреді) және түс атрибуттары үшін 768 байт пайдаланды. Бұл графикалық дисплейдің жалпы көлемін 6912 байтқа жеткізеді, бұл Spectrum дәуіріндегі "түсті" мүмкіндіктері бар компьютер үшін салыстырмалы түрде аз көлем. Бұл графикалық архитектура Синклер мен Амстрадтың Spectrum-ды қайта жобалауларында, Amstrad-тың соңғы үлгісі ZX Spectrum +3-ке дейін сақталды, тіпті кейінгі үлгілерде 128 КиБ жедел жад болғанымен, жадты үнемдеу қажеттілігі азайды. Архитектура артқа қарай үйлесімділікті сақтау үшін сақталды. Атрибуттар Commodore 64, MSX және NES сияқты басқа компьютерлер мен консольдерде де қолданылды, бірақ атрибут блоктарының мөлшері мен блокқа түстер саны әртүрлі болды. Дегенмен, аппараттық сприттерді пайдалану арқылы атрибуттар қақтығысының алдын алуға болады. Thomson MO5 және TO7 микрокомпьютерлері, Oric 1, MSX 1 архитектурасы және Texas Instruments TMS9918 бейне дисплейін басқарушыға негізделген басқа жүйелер де ұқсас шектеуге тап болды: көлденең бағыттағы сегіз пикселден тұратын әр топ үшін 16 түстің тек екеуі ғана қолжетімді, бұл Spectrum-дағыдан ұқсас, бірақ аздап әлсіз әсер береді. MSX 1-де Sinclair Spectrum-дағыдай, 8x8 пикселдік аймақ үшін бір түс атрибуты байты емес, сегіз байт болды, әр 8x1 пикселдік топқа бір байттан. Осылайша, Spectrum 8x8 пикселдік шаршы аймақ үшін бір түс жұбымен шектелген болса, MSX 1 тек сегіз іргелес пикселдің "сызығы" үшін бір түс жұбымен ғана шектелді. Сонымен қатар, MSX1 атрибуттар қақтығысына ұшырамаған сприттерді де пайдалана алды (дегенмен MSX 1 сприттерінің де өз шектеулері болды, мысалы, монохромды болуы). Бірақ бұл техникалық артықшылық MSX 1 жүйелеріне жақсырақ суреттер жасауға көбінесе көмектеспеді. MSX 1-дің мәселесі – Spectrum ойындарын MSX 1-ге көшірген көптеген еуропалық бағдарламалық компаниялар MSX 1-дің Spectrum-дан басымдықтарын ескермеді, сондықтан MSX 1 нұсқаларында да атрибуттар қақтығысы болды (мысалы, Jack the Nipper II: In Coconut Capers). Ауыстыруды жеңілдету үшін бағдарламалық жасақтама жасаушылар Spectrum-дың бір атрибуты байт мәнін MSX 1-дің барлық сегіз сәйкес атрибуты байттарына көшірді. Сол себепті бағдарламалық компаниялар MSX 1-дің сприт мүмкіндіктерін де ескермеді, және бейне дисплей мүмкіндіктері басқа жағынан өте ұқсас болғандықтан (256 × 192 ажыратымдылық, 16 түс), екі жүйе де бір ойын үшін дерлік бірдей суреттерді шығарды. Керісінше, жапондық MSX 1 ойындары MSX 1-дің барлық мүмкіндіктерін пайдаланды, нәтижесінде көбінесе жақсырақ көрінетін ойындар шықты.

Әсерлер

Атрибуттардың қақтығысын болдырмау үшін статикалық графикалық дисплейлерді сақтықпен құру қажет болды. Түс 8х8 пикселдік блоктарда ғана қолданыла алатындықтан, егжей-тегжейлі түсті графика жасау мүмкін емес еді. Мұқият жоспарлау арқылы әсерлі нәтижелерге қол жеткізуге болады, сондай-ақ түстердің өзгеруін дисплейдің жаңарту жиілігімен синхрондауға болады – әдетте теледидар экраны. Дегенмен, анимациялық дисплейлер жасау қиын болды, бұл бейне ойындар ойнауға арналған машина үшін маңызды кемшілік еді. Егер дисплейдің қозғалмалы бөлігі тиген кезде 8х8 блоктан бір пикселдің түсі өзгерсе, бүкіл блоктың түсі ауысатын еді. Сондықтан егжей-тегжейлі қозғалатын графиканың артынан жылдам өзгеріп тұратын түстердің жағымсыз жиектері қуып жететін.

Айналадағы амалдар

Алғашқы бағдарламалық құралдар бұл мәселені елемеді. Кейін стандартты шешім – экран шеттеріндегі әшекей жиектер сияқты статикалық элементтер үшін түс пайдалану болды, мысалы, есептің көрсеткіштері немесе түрлі аспаптардың белгілері, ал барлық анимациялық графика кішкентай орталық монохромды аймақта орналастырылды. Бұл графиканы жылдамдатып, экранның кішкентай бөлігін жаңартуға мүмкіндік берді – кішкентай аймақ және тек пиксельдік ақпаратты өзгерту арқылы түсті аймаққа қол тигізбеу. FTL-дің Light Force бағдарламасы сияқты кейбір Spectrum бағдарламалық құралдары толық түсті жылжымалы графиканы қол жеткізу үшін өте мұқият графикалық дизайнды пайдаланды, негізінен экрандағы элементтердің дизайнын және олардың қозғалыс жолын 8×8 түсті ажыратымдылық шегіне дейін шектеді. Сондықтан қозғалатын элементтер салыстырмалы түрде үлкен, блоктық немесе шаршы тәрізді болып келді, олардың қозғалысы шектелген, бірақ бұл көзбен байқау қиын болды және толық түсті графиканы көру Spectrum пайдаланушыларына үлкен әсер етті. Басты әзірлеушілер атрибуттардың қақтығысу мәселесіне толыққанды шешім таба алмады, олар жылдам және анық графика қажет болғанда монохромды графикалық әдісті, ал жағдайға қарай толық түсті графикалық әдісті пайдалануды жөн көрді. Дисплейдің бір жолын салуға дисплейлік аппараттық құралға мүмкіндік беріп, келесі жол салынбас бұрын RAM атрибутын өзгерту арқылы әр жеке жолға әртүрлі атрибуттарды беру үшін, белгілі бір уақытта RAM атрибутының аймағын өзгертуге мұқият назар аударуға болады. Бұл өзгерістер бағдарламалық құралда жасалуы керек еді және бағдарламалауға көп уақыт кетіп, әдетте бұл әдіс арнайы эффекттермен шектелді. Бұл әдіс демосценада да кең таралған.

Проблема және оның шешімдері

1987 жылға дейінгі көптеген ойындар атрибуттар қақтығысын назарға алмады. Кейінірек шыққан ойындардың кейбіреулері, мысалы Knight Tyme және Three Weeks in Paradise, ойыншыларға атрибуттар қақтығысының екі режимін таңдау мүмкіндігін берді: бірі басты кейіпкердің атрибуттарын елемейтін, кейіпкерді фонға сіңіріп, ал керісінше, фондық суреттерге қарағанда кейіпкерлердің түс схемасына басымдық берді. Тағы бір шешім – 1984 жылы Knight Lore ойынының Spectrum нұсқасында жасалғандай, графикті екі түспен көрсету, яғни монохромды ету. Көптеген ойындар толық түсті фон мен «кейіпкерді жылжыту» (орта сегіз пикселге қадаммен жылжытылатын) әдісін қолданды, бірақ Double Dragon сияқты, тиімді түрде мөлдір монохромды спрайттар қолданылды, олар түске тәуелді болмай, көзге түсетіндей етілді. Көптеген ойындар осы әдісті тегіс пикселдік жылжумен қолданды, бірақ бір кейіпкер блогының элементтері келесіге «өткенде» атрибуттар қақтығысы анық көрінетін. Толық түсті графиканы қолданудың айқын (бірақ толық сәтті емес) мысалы – Altered Beast ойынының Spectrum нұсқасы. Ойын айқын атрибуттар қақтығысынан зардап шегеді. Бағдарламашы Дон Пристли өзінің бірнеше ойыны үшін үлкен, мультфильм сияқты спрайттарды пайдаланып ерекше стиль жасады, олар әдепті түрде кейіпкер блогының барлығын қамтып, шаршы болып көрінбеуі үшін жасалған. Бұл техниканың кемшілігі – ойын графикаға сәйкес жасалуы керек болды, сондықтан ол басқа платформаларға порттау үшін қолайлы емес еді. Бұл әдісті қолданған ойындарға Popeye, The Trap Door, Through the Trapdoor және Flunky кірді. Осыған ұқсас әдісті қолданған басқа да әзірлеушілердің арасында Майк Синглтон (Dark Sceptre) және Gang of Five (Dan Dare: Pilot of the Future) бар. 1994 жылы бағдарламашы Игорь Мазница ZX Spectrum 128 негізінде «ZX Poly» көппроцессорлық платформасын жасады; бұл платформа атрибуттар қақтығысынан аулақ болуға мүмкіндік береді және тіпті орындалатын кодты өзгертпей көптеген ескі ойындарды түстеуге болады.