X1turbo Agency

X1turbo Agency ブログ

8bitコンピュータ X1turboの探求サイト

X1turbo Agency

Newグラディウス デモ 描画 (パレット,座標系)

プレーン描画

色数は減ってしまいますが、高速化には1プレーン,2プレーンの描画が効果的です。
使用しているパレットの組み合わせは以下になっています。

f:id:x1turbo_agency:20190509010241p:plain
パレットセット

2プレーン描画では、以下の組み合わせ色が使用できます。

  • 青系統の敵(白/水色/青)の組み合わせ
  • パワーアップカプセルや、オプション、赤色系統の敵(白/黄色/赤)の組み合わせ
  • 通常敵にもよく使用するその中間(白/水色/赤)

f:id:x1turbo_agency:20190509010311p:plain
パレット組合せ

このバリエーションのために、白色を 2色割り当てています。

また、1プレーンでも、白色、赤色、水色の表現ができます。
弾やミサイル、レーザーなどは1プレーンで描画しています。
前回の記事でも書きましたが、同時アクセスモードで3プレーンを消去しているため、
2プレーン描画時に1プレーンがクリア済の場合が多いです。
もし書き込まれていた場合は、ビットライン機構によって重ね合わせが行われます。

プレーンの組み合わせと縦サイズ別に20種類程度の描画処理を分けています。

画像変換

画像の変換は自前のコンバートツールを使っています。
高速化のためにクリップ情報などを事前に計算しています。

コンバート例:

 ; データテーブル
 en1_p0_c2:
  db 0fch ; Pivot(x) -4
  db 0f8h ; Pivot(y) -8
  db 8 ; データ数
  dw en1_p0_c2_0 ; 0
  dw en1_p0_c2_1 ; 1
  dw en1_p0_c2_2 ; 2
  dw en1_p0_c2_3 ; 3
  dw en1_p0_c2_4 ; 4
  dw en1_p0_c2_5 ; 5
  dw en1_p0_c2_6 ; 6
  dw en1_p0_c2_7 ; 7
  
 en1_p0_c2_0:
 ; Xoffset: 0
 ; Mask: [G R]
 ; OutSizeX: 16 OutSizeY: 16
  
  db 183 ; clipy(byte) 200-sizey-1
  db 020h ; DrawType (Plane: RG SizeY: 16)
  db 39 ; clipx(right) 40-sizex+1
  db 63 ; clipx(left) 64-sizex+1
  db 2 ; sizex(byte)
  db 48 ; sizey(pitch)
  
 ; 0
  db 0ffh, 000h, 000h
  db 0ffh, 000h, 000h
  db 0feh, 001h, 000h
  db 0e8h, 017h, 000h
  db 0c8h, 037h, 001h
  db 0c8h, 037h, 000h
  db 085h, 07ah, 010h
  db 082h, 07ch, 011h
  db 0c2h, 03ch, 019h
  db 0c1h, 03eh, 00ch
  db 0e2h, 01dh, 000h
  db 0fch, 003h, 000h
  db 0f0h, 00fh, 002h
  db 0f8h, 007h, 001h
  db 0fch, 003h, 000h
  db 0ffh, 000h, 000h

ドット絵ツール Edge

画像データはドット絵ツールのEdgeを使用して 256色pngで作成しています。
パレットを扱えてドット絵を編集するにはとても便利ですが、ヌキ色や半透明には対応していません。
今回は特定のパレット番号以上はヌキ色になるようにしました。
画像にあるグレイ色をヌキ色として扱います。
Edgeはパレットが16色以下になると出力pngが16色になるため、ヌキ色を16色以上の場所に配置しています。

f:id:x1turbo_agency:20190509010944p:plain
ドット絵ツール Edge

座標系

画面サイズは320x200です。

320は8bitで収まらないため、通常は座標計算を16bitで行い、
計算用に固定小数点 8bitの 24bitで取り扱うことが多いですが少々重くなります。

Newグラディウスデモでは、高速化のため 9:7の座標系を採用しました。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
XH XH XH XH XH XH XH XH XH XL XL XL XL XL XL XL

0-319の座標は、上位byteでは 0~159で表現されます。
9bit分なので1bitを下位バイトに持たせています。
この方法のメリットは以下の通りです。

  • 24bitではなく16bitの計算で収まる。
  • 表示座標を求める時は、1bit シフトして下位byteの最上位ビットと合わせて行います。
  • 固定小数点が7bit使える。(大抵は 4bitもあれば十分)
  • 移動スピードが2の倍数の時は上位byteのみ計算する。
  • キャラクタ同士やBGの当り判定は 8bitで計算を行って高速化できる。

処理計測方法

処理を計測する方法を書いておきます。
パレットによる計測を行っています。
パレットの0番を赤や青色などに設定して、少し待ち、また元の黒色に戻します。
こうすることで現在の走査線の位置に色を付けることができます。

処理を計測したい所を挟み、その2点間の差を計算すると処理時間を知る事ができます。
1ラインが 63.5μsecなので、もし10ライン差があった時は、0.635msec程度の
処理がかかっていることになります。

武田さんがリリースしているエミュレータは、この処理を行っても実機とほぼ同じ位置に
パレットが表示されるため、処理計測をエミュレータ上で確認することができます。
これはすごい再現性です。

f:id:x1turbo_agency:20190509074212p:plain
パレットによる処理計測

※ 上記の画像はかなり前のテストバージョンです。