Деконструкция «Иллюзии»
Автор: lordcoxis
Как некоторые из наших читателей, несомненно, помнят, демо «Illusion» от группы X-Trade заняло первое место на Enlight 1996, оставив позади «Vibrations» от DMS (которому я на самом деле симпатизировал больше). Я отчетливо помню (ну, почти), как пытался запустить его на своем классическом Speccy, только чтобы обнаружить, что работает оно (в сущности) отвратительно. В то время я не был полностью погружен в тонкости архитектуры Pentagon (или любых других клонов из бывшего СССР), поэтому не мог до конца понять, что происходит. Как демо, полное тормозов и глюков, могло победить на конкурсе? Было ясно, что здесь что-то не так. Пару месяцев спустя, благодаря общению (в основном) с Raver/PHT, я наконец понял, на что способны Pentagon и Scorpion, и всё встало на свои места. Конфликтная (медленная) оперативная память в классическом Speccy замедляла выполнение большинства процедур, что и приводило к тормозам и графическим искажениям. Там даже была часть, где прямо говорилось, что она работает только на Pentagon (и, следовательно, даже не на других клонах без медленной памяти).
Перенесемся на 25 лет вперед... По причинам, которые я уже не могу вспомнить, я решил заглянуть «под капот» этого «плохого парня». Сейчас, когда я об этом думаю, возможно, я хотел проверить, смогу ли я заставить его работать на классических Speccy, оснащенных интерфейсом Z80DMA. Итак, я начал разбирать этого маленького ублюдка по кусочкам (как будто у меня не было дел поважнее), пока наконец не добился того, что демо стало работать на 99% идентично версии для Pentagon, но уже на классических 128/+2/+3. Во время релиза introspec расспросил меня о процессе на Pouet, и это побудило меня написать данную статью — но поскольку прошло уже больше двух лет, детали могут быть немного размытыми. Так что наберитесь терпения, пока я буду стараться вспомнить всё как можно точнее...
Общие оптимизации
- Критически важный код и переменные были перемещены в быструю оперативную память, где это было возможно;
- Векторы прерываний IM2 также были перенесены, чтобы избежать «снега»;
- Добавлено переключение стерео AY (ABC/ACB);
- Автоматическое определение модели 128/+2 и +2A/+3;
- Всё было перепаковано с помощью ZXPac от Mr.Spiv.
Ситуация «курицы и яйца»
Когда вы доходите до эффекта с яйцом, прыгающим по полю точек, у вас начинает складываться впечатление, что у вас какая-то убогая модель Speccy. Музыка замедляется, а яйцо и поле точек дико мерцают. К счастью, синхронизация в этой секции реализована через простой цикл-счетчик, поэтому было достаточно применить «Общие оптимизации» и настроить значения цикла для каждой модели Speccy.
У меня большие «шары»
Следующий эффект — это большой шар (упс), прыгающий поверх скроллера из точек, и результат в основном такой же, как в предыдущем эффекте — громоздкая смесь тормозов и мерцания, из-за которой вам (почти) захочется пойти и купить C64. Опять же, синхронизация выполнена с помощью цикла/задержки, и это было легко исправить.
У меня маленькие «шары»
Эффект с водоворотом и маленькими шариками, прыгающими вокруг (а, и еще дурацкий логотип «Illusion» сверху, позор), почти работает хорошо, но в некоторых местах подтормаживает. И снова общих оптимизаций вместе с изменением счетчика цикла синхронизации оказалось достаточно, чтобы всё исправить.
Звуковой ротозумер
Эту часть исправить было не так просто. Пришлось жонглировать кучей кода, перемещая его из медленной памяти в быструю, и даже тогда я не смог найти безопасное место для вектора IM2. В итоге мне пришлось разместить его внутри битмапа Sonic, в том месте, где он почти сливался с существующей графикой, в надежде, что это не будет слишком бросаться в глаза (удалось ли мне это?).
Живой или мертвый, ты идешь со мной
Это та самая часть, где в скроллере текст: «SORRY, BUT THIS EFFECT AVAILABLE ONLY ON PENTAGON 128.». В ней представлен текстурированный шар с частью титульного экрана игры «RoboCop», прыгающий поверх полноэкранного прыгающего скроллера в нижней части. Это была та самая часть, на исправление которой у меня ушло больше всего времени, потому что даже со всеми обычными оптимизациями она всё равно не укладывалась в один кадр. Я пытался уменьшить ширину скроллера, пытался срезать по 1 растру сверху и снизу шара — но всё без толку. Я потратил несколько дней на анализ кода и попытки мыслить нестандартно, но это действительно выглядело как тупик. Я уже собирался положить проект на полку, когда меня осенило: код очищает всю область шара, но на самом деле ему это не нужно. Я могу очищать только нужные строки сверху, когда он движется вниз, и наоборот — когда он идет вверх. Это высвободило достаточно тактов, чтобы эффект работал без изменений на любом классическом 128 Speccy.
Это конец
Финальный эффект — это здоровенный масштабируемый скроллер, который также замедляется при максимальных коэффициентах масштабирования. Несмотря на все оптимизации, он всё равно притормаживал в некоторых местах (в зависимости от части музыки), поэтому мне пришлось немного уменьшить максимальный коэффициент зума. В итоге (каламбур намерен) я думаю, что всё получилось неплохо.
А теперь всё сначала
Первая итерация фикса вылетала вскоре после зацикливания — это произошло потому, что я не знал, что демо зацикливается после завершения (никогда не ждал достаточно долго, позор мне). Она падала, так как во время первого прогона я перемещал данные между страницами памяти, не ожидая, что они понадобятся снова.
Так что, после того как все эффекты были исправлены, мне пришлось переделывать кое-какие куски, чтобы всё оставалось на своих местах после того, как демо шло на повтор.
И вот, собственно, и всё! Надеюсь, вам понравилась эта статья, а если нет — не стесняйтесь винить во всем introspec ;) Вы можете найти фикс Illusion здесь:
Поделитесь вашим мнением о статье