Как предлагает Jester, в качестве первой оптимизации просто повторите lda
, and
, sta
и dey
восемь раз. Устраните cpy
и bne
. Это немедленно сэкономит 103 цикла. Даже если вы хотите сохранить формальный цикл, обратите внимание, что dey
устанавливает нулевой флаг, поэтому вам не нужен cpy
.
В качестве второй оптимизации рассмотрим скомпилированный спрайт. Вместо того, чтобы выполнять чтение из sprite, x
, вы бы закодировали эти значения непосредственно в свою подпрограмму, создав отдельную подпрограмму для каждого спрайта. Это сократило бы еще 16 циклов.
При этом ваши lda
будут 4 цикла в выровненной таблице, а не 3. Таким образом, есть 8, которые вы не учли. Это означает, что развернутый плюс специализированный для вашего спрайта = 102 цикла (опустив конечный dey
).
Не зная архитектуры C64 и/или того, что делает остальная часть вашего кода, если тот, кто принимает SUPERIMPOSED
, может сделать это со страницы стека, рассмотрите возможность записи вывода в стек, а не через индексированную адресацию. Просто загрузите s
с соответствующим начальным значением и сохраните новые результаты через pha
. Это сэкономит два цикла на хранилище за счет 12 дополнительных циклов настройки и восстановления.
Исходя из этой мысли, если у вас была свобода в том, как выглядят эти таблицы, рассмотрите возможность изменения их формата — вместо одной таблицы, которая содержит все восемь байтов TILESET
, используйте восемь таблиц, каждая из которых содержит один байт этого числа. Это устранило бы необходимость корректировать y
в цикле; просто используйте другую целевую таблицу в каждой развернутой итерации.
Предположим, что и TILESET
, и SUPERIMPOSED
могут быть восемью таблицами, что приводит вас к:
LDA TILESET1, x
AND #<value>
STA SUPERIMPOSED1, x ; * 8
[... LDA TILESET2, x ...]
... что составляет в общей сложности 88 циклов. Если SUPERIMPOSED
является линейным, но находится на странице стека, то:
TSX
TXA
LDX #newdest
TXS
TAX ; adds 10
LDA TILESET1, y
AND #<value>
PHA ; * 8
[... LDA TILESET2, y ...]
TXS ; adds 2
... что составляет 84 цикла.
Позднее добавление:
Если вы хотите предварительно умножить индекс в x
на 8, эффективно уменьшив индексируемый диапазон до 32 плиток, вы можете продолжить заполнение линейного выходного массива без корректировки y, как показано ниже:
LDA TILESET, x
AND #<value1>
STA SUPERIMPOSED, x
LDA TILESET+1, x
AND #<value2>
STA SUPERIMPOSED+1, x
... etc ...
Таким образом, вам потребуется восемь копий этой подпрограммы с разными базовыми адресами таблиц, чтобы получить 256 выходных тайлов. Предположим, у вас есть 20 спрайтов, что составляет в общей сложности 20 * 8 = 160 копий вашей процедуры построения спрайтов, каждая из которых, вероятно, будет иметь размер порядка 100 байт, поэтому вы тратите около 16 КБ.
Если ваша игра намного тяжелее для одного типа спрайтов, чем для других — например. обычно это два или три космических корабля, стреляющие тысячами пуль друг в друга — тогда, очевидно, вы можете очень выборочно оптимизировать и уменьшить общий след.
person
Tommy
schedule
27.09.2015
x
для индексации, ноy
для цикла? - person Jester   schedule 27.09.2015