ワンポイントテクニック No.021 G800シリーズ対応

テーブル処理で高速化


 メインルーチン内で重い処理(複雑な計算)が必要な場合は処理速度が気になることも多い思います。そんな場合べき乗演算の高速化のように処理自体を簡略化することが可能なものであればそれを行うことで高速化ができますが、そういう高速化ができないものの方が実際は多いと思います。
 そこで役に立つのがテーブル処理です。あらかじめ計算したものなどを配列変数などに入れておくことでメインルーチン内での処理時間を大幅に削減が可能になるわけです。

 例えば、以下のリストを見てください。

FOR J=1TO 5:X(ASC MID$ ("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤ*ユ*ヨラリルレロワ***ヲン****ァィゥェォャ*ュ*ョ12345",I*5+J,1)=J:NEXT

 これは相性占いで使用しているものですが、これは名前をカナ入力してア段ならば1、イ段ならば2という感じでカナを1〜5の形で変換しています。これをストレートに変換するならばIF文や論理式をいくつも用いる必要があり決して軽い処理とはいえないのですが、あらかじめ変換したものが配列変数に入れておいて読み出すだけならば処理速度は大幅に向上します。

 またBASICでは重い三角関数を使った演算ですが、これはゲームではキャラの移動などで使用することも少なくありません。こういうときもあらかじめ計算しておいたものを入れる配列変数に入れておくことで高速処理が可能になります。

FOR I=0 TO 35:S(I)=SIN (I*10):C(I)=COS (I*10):NEXT

 ただし、この例のままだとゲーム内で10度単位で使用する場合に限られます。もしもこの精度では足りない場合は多くのメモリが必要になりますが5度単位や1度単位などで配列変数に入れておくと良いでしょう。シュプールでは移動は5度単位となっているのであらかじめ5度単位で計算された三角関数の値をゲーム内容に合わせた形で配列変数に入れることで高速化しています。
 データといってもあらかじめ計算したデータに拘る必要はありません。例えば、使用するキーコードをあらかじめ配列変数に入れておけば使うキーがいくつになっても1つ分の処理で済ませることが可能になります。2LINEオルガンのように使うキーは多くても処理は非常に高速になります。(音程データもあらかじめ配列変数に入れてあるのでさらに速い)

 データを入れるものは配列変数に拘る必要はありません。数が少ないのであればEVALを使えば固定変数に入れてそれを配列変数のように読み出すことも可能だし、入れる値が0〜255の整数で良ければPOKE文を使いメモリに直接書き込んでもいいでしょう。
 このテクニックは古くから多く使われているもので機種を問わずに使える万能的な高速化テクニックなので使用したことがないという人はこれを機会に覚えておくとよいと思います。


RETURN

inserted by FC2 system