[Top Page][Edit][Discussion][Edit History][All Pages][Recent Changes][->Japanese]

HSPコンテスト:ショートプログラム:数学・物理編:フレーム更新


 FPSについての概念が分かっていないひとが多そうなので書きます。

 パソコンのディスプレイの周波数は基本的に60Hzです。つまり一秒回に画面は60回更新されます。そのため、awaitの値を小さくすると描画されないフレームが存在することになります。ここではフレーム問題等を含めたプログラミング手法について考えて見ます。

 60回画面が更新されるうちの、一回のことを1フレームと呼びます。1フレームは何秒でしょうか。簡単に計算してみますと、1/60=0.01666...となります。1フレームは大体16ms程度と覚えておくとよいでしょう。これ以上短くしても、画面に描画されないだけで、意味はありません。ユーザーにawaitの値を入力させるソフトをいくらか見ますが、そういったものはあまりお勧めしません。

 速度と加速度の単位はそれぞれm/sとm/s^2です。そのため、FPSが変わると、速度と加速度の単位を変えなくてはいけません。1秒間に10mの距離を進む車の速度は10m/sです。この車が0.5秒で進む距離は10*0.5=5mです。1フレーム当たりに進む距離は10*0.01666...=10/60mとなります。FPSが二倍になると速度は二分の一になるという考え方はすぐに出来ると思います。60FPSで1秒当たり10ドット動かしたいなら、毎フレーム0.16ドットずつ動かせばよいことになります。ここらへんの話は固定小数点について調べてください。また加速度も同様です。これを踏まえたテストプログラムを走らせてみましょう

repeat 10,1
        a=98000
        v=0
        l=0
        s=cnt
        repeat 100*s
         v+=a/s;
         l+=v/s;
        loop
        mes l
loop
stop

実行結果
494,900,000
492,450,000
491,623,200
491,225,000
490,980,000
490,806,400
490,700,000
490,612,200
490,504,000
490,490,000

 小数誤差が怖いので、加速度は重力加速度の9.8を1000倍したものを使っています。物体が100秒間自由落下したさいの落下距離を計算しています。sはそれの分解能です。 本来ならば加速度と距離の公式からL=1/2 * a *s^2 =490,000,000となりますが、解析的に解くため、分解能のからこのような結果になります。つまり、分解能を上げたほうが計算結果はよくなるということを覚えておきましょう。また60FPSのゲームを30FPSで動かす場合、内部処理を60FPSで行い描画処理を30FPSで行わないと誤差が生じることがわかります。意図的に処理落ちさせる場合は次のようにするといいでしょう。

repeat
 repeat 処理落ちのレベル
 gosub *内部処理
 loop
 gosub *描画処理
 await 16*処理落ちのレベル
loop

FPSを半分にして、速度を単純に二倍にしたりすると、敵を弾がすり抜けてしまったりするため、このようにします。

なんか、フレーム更新の話が、物理の話になってしまった。申し訳ない。