6

我计划在我的新 C64 项目中使用多色字符模式下的软件精灵。我的想法是使用叠加“子弹”精灵数据来平铺数据。

我想我可以在地址 'TILESET' 上拥有tileset 数据,在地址'SPRITE' 上拥有精灵数据。我可以将这两者结合起来准备一个具有动态计算背景的子弹字符并存储在地址“SUPERIMPOSED”中

我写了以下代码和循环计数来检查它是否可行。我认为不是。循环消耗了 219 个周期。近四个光栅线。而且我没有包括在此循环之前所需的其他必要计算。就像计算目标地址一样。

当我想在屏幕上显示 16 个项目符号时,需要 64 个栅格或 8 个字符行。于是我开始怀疑。这是正确的方法吗?或者有没有其他更优化的方式来做同样的工作?

                         cycles
                        ---------
    ldy #$07             4 x1 = 4   
-   LDA TILESET,x       3 x8 = 24
    AND SPRITE,x        4 x8 = 32 
    STA SUPERIMPOSED,x  5 x8 = 40
    dey                 2 x8 = 16
    cpy                 4 x8 = 32
    bne -               3 x8-1 = 71 
                        ----------
                        219 Cycle

我正在考虑在背景中有重复模式。这样我就可以使用相同的子弹图块而无需重新计算。

4

1 回答 1

7

正如 Jester 建议的那样,作为第一次优化,只需重复、lda和八次。消除和。这将立即节省 103 个周期。即使您想保留正式循环,请注意设置零标志,因此您不需要.andstadeycpybnedeycpy

作为第二个优化,考虑一个编译的精灵。而不是从 执行读取sprite, x,您可以将这些值直接编码到您的例程中,为每个精灵创建一个不同的例程。那又减少了 16 个周期。

话虽这么说,lda在对齐表中您将是 4 个周期,而不是 3 个。所以有 8 个您没有考虑。这意味着 unrolled plus 专门用于您的 sprite = 102 个周期(省略了 final dey)。

在不了解 C64 架构和/或其余代码的作用的情况下,如果任何人都SUPERIMPOSED可以从堆栈页面中提取,请考虑将输出写入堆栈而不是通过索引寻址。只需加载s适当的种子值并通过pha. 这将在每家商店节省 2 个周期,代价是 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 ...

因此,您需要具有不同表基地址的该例程的 8 个副本仍然能够命中 256 个输出图块。假设您有 20 个 sprite,总共有 20*8 = 160 个 sprite 绘图例程副本,每个副本可能大约为 100 个字节,因此您花费了大约 16kb。

如果您的游戏在一种 sprite 上比在其他 sprite 上要重得多——例如,通常是两到三艘宇宙飞船互相射击数千颗子弹——那么显然你可以非常有选择地优化并保持总占用空间小。

于 2015-09-27T13:24:19.097 回答