2015-09-27 38 views
6

我打算在我的新C64项目中使用多色字符模式下的软件精灵。我的想法是使用叠加'子弹'精灵数据来平铺数据。更好的方式来动态更新平铺数据上的Commodore 64

我想我可以在地址'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 

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

+0

展开循环以摆脱代码增加代价的开销。你似乎还在使用'x'进行索引,但是'y'用于循环? – Jester

+0

如果您的精灵的大小超过一个像素,并且您希望能够定位任何像素,则需要更多代码,包括叠加2或4个字符(拼贴)的功能。如果精灵只是一个像素,您可以简化代码。 –

+0

@RossRidge我还没有找到精灵。所以我不确定这个尺寸,但是它的大小约为4x4。 – wizofwor

回答

7

由于小丑表明,作为第一优化重复刚才的ldaandstadey八次。消除cpybne。这将立即节省103个周期。即使你想保持正式的循环,注意dey设置零标志,所以你不需要cpy

作为第二个优化,考虑编译的精灵。您不需要执行sprite, x中的读取操作,而是将这些值直接编入您的例程中,为每个精灵创建一个独特的例程。那会再减少16个周期。

这就是说,你的lda将是一个对齐表中的4个周期,而不是3.所以有8个你没有说明。这意味着展开加专用于你的精灵= 102周期(省略了最终的dey)。考虑将输出写入堆栈而不是通过索引编址,不知道C64架构和/或代码的其余部分如何执行,如果任何引入SUPERIMPOSED的人可以从堆栈页执行此操作,请考虑将输出写入堆栈,而不是通过索引编址。只需使用适当的种子值加载s并通过pha存储新结果。这将以每12个额外的设置和恢复周期为代价节省两个周期。

继续这个想法,如果你在这些表的外观上有自由,那么考虑切换它们的格式 - 而不是一个包含TILESET所有八个字节的表格,而是使用八个表格,每个表格保存一个字节。这将消除在循环中调整y的需要;只需在每个展开的迭代中使用不同的目标表。

假设都TILESETSUPERIMPOSED可以八张桌子,让你到:

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个周期。

晚此外:

如果你愿意通过8到预乘在x索引,有效地降低你的可转位的范围为32瓦,则可以继续进行填充的线性输出阵列,而无需调整Y,按照:

LDA TILESET, x 
AND #<value1> 
STA SUPERIMPOSED, x 

LDA TILESET+1, x 
AND #<value2> 
STA SUPERIMPOSED+1, x 

... etc ... 

所以,你需要8个具有不同表格基地址的例程,才能够达到256个输出图块。假设你有20个精灵,这就使得你的精灵绘图程序总共有20 * 8 = 160个副本,每个副本可能大约为100个字节,所以你花费的大约16kb。

如果你的游戏在某种精灵上比在别人身上重要得多 - 例如,通常有两三艘宇宙飞船在彼此之间射击数千枚子弹 - 显然,你可以非常有选择性地进行优化,并且保持总占地面积减少。