Research 04 / Frontend

每一種內容,交給適合的硬體路徑。

設定選單看似比關卡簡單,但整頁縮放、SHP 解碼與文字重畫會讓音樂明顯鈍住。解法不是只換一個 video mode,而是分離靜態與動態工作。

為什麼按一下就卡

早期 Game Menu 會在每次進入、游標移動或上下層切換時,重新從 stock PIC/SHP 解碼、組合 320×200 source page、縮放到 240×160,再把文字畫進 bitmap。CPU 在同一輪做完所有工作,Maxmod 沒有足夠時間更新。

三種內容,三種策略

A

完全靜態

Chrome、設定頁與固定 panel 在 build-time 從原版資料準備為 Mode 4 page/rows,runtime 線性複製。

B

狀態依賴

船體、裝備、金錢依 HDT 與 player state 組合;完成後放進 19.2 KiB EWRAM ship-panel cache。

C

持續動態

Next Level 旋轉星球用硬體 OBJ;文字在最終 240×160 座標獨立畫,避免跟著背景縮糊。

通用 source stamp catalog

Upgrade Ship 的裝備圖不能把每個組合都烘成完整頁面。build 端因此產生 15,525 個 stock source stamps,涵蓋必要 tyrian.shp、Sprite2 banks 與 4/5 scale 的 25 個 sub-pixel phase。runtime 仍由原版資料 ID 決定圖形, 只是不再做 RLE 與逐像素 resize。

15,525source stamps
7.90 MiBsparse stamp catalog
0runtime SHP decode

轉場不是一次 function call

新頁面在 scratch page 分階段準備:每次最多 80 rows page copy、60 rows panel、單一 Next Level 選項或單一 Upgrade row。舊畫面保持可見, mmFrame() 每個 VBlank 都會執行;只有最後才排程一次 Mode 4 page flip。

Quit Game 對話框再細分成背景 capture、shade、overlay 與 choices。 取消時直接還原 cache,不重新建構 Game Menu。

960 次壓力轉場

八條已開放雙向路徑各做 120 次,共 960 次。原始完整矩陣以 High/Normal 驗證,結果為 0 missed VBlank、0 runtime SHP、 0 runtime Sprite2、music active;最大單 phase 118,465 cycles,低於 180,000-cycle 回歸門檻。v89 LOW 正式版沿用相同、與 detail 無關的管線。

以快取與靜態 panel 組成的目前版本 Game Menu
Game Menuship cache + static panel