В этом файле вы найдете замечания и комментарии к исходникам
моей интро. Кроме того, многие вещи мне было просто влом
комментировать в исходнике, поэтому тут я тоже постараюсь
уделить им внимание.
Сразу постараюсь ответить на возможные вопросы:
Q: Что это за идиотская номинация - 16K? Нигде такого нет.
A: Содрана с ZX. Вообще-то предполагалось, что это будет номинация
для начинающих (т.е. меня :) В 16K нетрудно засунуть хоть какую
музыку, при этом писать можно на ЯВУ, что как-никак удобнее.
В соседних 4K и 64K гораздо сложнее: 4K - огромное кол-во работы
на асме, а 64K - вообще в некотором смысле высший пилотаж.
Хотя на BP тоже можно запросто написать 64K, но это будет трудно
сравнивать с работами Haujobb, Proxium и др. Ну а в 16K особых
ориентиров нету, поэтому никто не скажет, Fancy - suxx или rulez.
Q: У тебя кривая процедура рисования треугольника.
A: Согласен, поэтому лучше ее не используйте. Вообще ее надо было бы
написать на асме, но не было времени. Кроме того, даже в самой
сложной сцене (с шестеренками - ~300 тр.) рисование треугольников
отнимает очень мало времени.
Q: А как вообще вся сцена рисуется?
A: Алгоритм художника. После матричного преобразования всей сцены,
прохожу по списку треугольников и выбираю те,
у которых Z-компонента нормали отрицательна.
Это конечно неправильно для перспективной проекции, но тоже вполне
сносно, зато не нужно считать всю нормаль :)
Потом я сортирую треугольники по среднему значению Z методом
bytesort (кажется так называется побитная лексикографическая
сортировка?)
и рисую от дальних к ближним.
Q: А где собственно музыка?
A: В файле patterns.obj содержится начало MOD'а вплоть до начала сэмплов.
Сами же сэмплы генерятся по данным из файла samples.obj
Q: А как они генерятся?
A: Для этого я написал простенький сэмплер. Процедура генерации весит
около 200 байт. (Чего не скажешь о редакторе сэмплов... )
Q: Ну а что за плеер?
A: Gusplay by CASCADA. Изначально это был чисто asm'овый плеер.
Потом один товарищ прикрутил его к паскалю, ну а затем уже я еще
раз его перелопатил, чтобы приспособить к интро.
ВНИМАНИЕ: теперь он играет ТОЛЬКО этот модуль,
так что если хотите играть что-либо другое - берите оригинал и
пляшите от него.
Q: Я скомпилировал интро, но оно весит гораздо больше 16K :(
A: Дык, паковать надо... Я паковал UPX'ом.
Q: Даже после упаковки!
A: Ладно, на самом деле надо еще выкинуть ненужную инициализацию.
Для этого я перекомпилировал модуль SYSTEM выкинув оттуда довольно
много ненужного.
Q: А нафига sintable.asm?
A: Для заполнения таблицы синусов ;) Дело в том, что если в паскале
использовать FPU (даже с $N+,E-), то он подключает около 3K лишнего
кода.
Из него конечно тоже можно много выбросить, но все-равно остается
много. Выход? А не использовать FPU. То есть его можно использовать
в ассемблерных вставках, но 287 - не рулит,
у него даже fsin нету :(
Кроме того, если вы посмотрите, КАК BP использует FPU,
то вам станет плохо...
Q: Что еще можно сделать, чтобы уменьшить размер?
A: Интуитивно кажется, что переписать что-нить на асме. Нифига!
От этого код действительно уменьшится, но он будет хуже паковаться
и итоговый размер будет больше. Другое дело, если ОЧЕНЬ МНОГО
переписать, но тогда смысл писать на паскале?
Так что, гораздо выгоднее просто стараться делать похожие участки
кода, использовать одни и те же операции в похожих случаях.
Еще нужно использовать локальные переменные, причем одинаково их
располагая. А вообще есть куча способов сделать код меньше,
но все они влияют на степень сжатия, поэтому предсказать итоговый
результат довольно трудно. Так что надо пробовать...
Q: А чё TASM ругается на АСМовые файлы?
A: Дык это... надо ставить не менее 2-х пpоходов.
У меня по умолчанию стоит tasm /m4 и никаких пpоблем.
По-кpайней меpе лишними пpоходы явно не будут.
P.S.
Интра вместе с исходниками на паскале лежит на
ftp.scene.org/pub/parties/2001/millenium01/in64/02-fancy.zip
|