2015-09-27 35 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。

如果你的遊戲在某種精靈上比在別人身上重要得多 - 例如,通常有兩三艘宇宙飛船在彼此之間射擊數千枚子彈 - 顯然,你可以非常有選擇性地進行優化,並且保持總佔地面積減少。