こんな感じ
for x = 0 to xm - 1
for y = 0 to ym - 1
var s = world[x,y] '変数に入れて配列アクセスを減らす
if s == 空白 then gosub @space
elseif s == 植物 then gosub @plant
...
endif
next
next
計算と表示を同時に行うより、全セル計算してから表示の方が、現状の locate + print をセル数分繰り返すより速い。
その場合、表示は
for y = 0 to ym - 1
locate 0, y
for x = 0 to xm - 1
var s = world[x,y]
color col[s]: print cg$[s];
next
print
next
などとして locate を省きます。col[] には種ごとの色、cg$[]には種ごとの文字を入れときます。
重たいのって
・命令が重たい(絵を描く、配列アクセスなど)
・やりかたが重たい(アルゴリズム)
に分けられて、この組み合わせで処理が早くなるものを選ぶという感じです
アルゴリズムとして、ループがFOR X: FOR Y: FOR C などで3段階になっていれば、最後のFOR C の処理は X*Y*C回数分実行されて、ここに重たい処理(命令・アルゴリズムGOSUBやDEF)があると全体として重たくなります。
その処理が1つ前のループで処理できないかとか、ループの中で処理しなくてもいいかとか、そもそも別のやりかたがあるのかとか、処理を考え直すのも高速化につながります
命令としては表示のように値1つ渡して1回表示する命令を何回も呼ぶより、まとめて値を渡して一気に表示する命令のほうが早いです
(内部処理として表示準備処理を何回も実行するか、まとめて1回するかの差)
MIKIさん
>GOSUBで飛んだ先で該当判定するより、
>該当判定してからGOSUBした方が速い。
GOSUB @LABEL
@LABEL
IF 条件式 THEN
・・・
ENDIF
RETURN
としていたのですが、
IF 条件式 THEN GOSUB @LABEL
と変更したところ、劇的に早くなりました。
メモ:FOR文をREPEATに置き換える
==============
FOR Y=0 TO MY
FOR X=0 TO MX
処理
NEXT
NEXT
==============
Y=0:P%=1:REPEAT
X=0:REPEAT
処理
X=X+P%:UNTIL X>MX
Y=Y+P%:UNTIL Y>MY
==============