ページ 11

フレームスキップ

Posted: 2009年12月08日(火) 02:22
by ft
処理落ちで速度が低下するのを回避するためにフレームスキップを導入したいと思うのですが、
どのようにしたら良いのでしょうか?
ソースはほとんど龍神録サンプルに沿った形となっています

Re:フレームスキップ

Posted: 2009年12月08日(火) 08:26
by Dixq (管理人)
処理に時間がかかる原因は描画にあると思っていいと思います。
弾幕の軌道計算がいくらかかるといえども、2D位の処理なら、簡単にCPUはやってしまいます。
また、計算はしないと座標が進みませんが、描画はしなくても以後の処理に影響がありません。

ということで、描画をスキップさせてやればいいことになります。
ここで注意が必要なのが、計算の関数と描画の関数を完全に分けることです。
少しでも以後の処理に関係するような計算を描画関数でやっていると、スキップするとおかしくなってしまいます。
描画関数は描画しかしないようにしましょう。
リプレイ機能を付けるなら、描画内でGetRandを使うのもダメです。
乱数は呼んだ回数で値が決まるので、呼ばない処理が入ると値が変わってきます。

ということで、処理落ちが発生したら、描画関数の処理を飛ばし、
1フレームに複数回計算関数を呼んであげて下さい。

Re:フレームスキップ

Posted: 2009年12月09日(水) 00:41
by ft
なるほど,そういう仕組みでしたか.
お蔭でフレームスキップを導入できました,ありがとうございます!

Re:フレームスキップ

Posted: 2009年12月09日(水) 00:55
by Justy

> 1フレームに複数回計算関数を呼んであげて下さい

 処理をスキップするフレームが2,3フレーム以内ならさほど問題ないかもしれません。
 しかしそれ以上になるとその数フレーム間のキー入力状態だけはなんとかしないと、
ちょっと右押しただけなのに、処理落ちの為にずっと右押されたことに
なってて衝突してしまったとか、反対にショットを撃とうとしてたけど、
処理スキップの為に撃てず、チャンスを逃した、とかいうケースになってしまうかも……。

Re:フレームスキップ

Posted: 2009年12月10日(木) 23:51
by Dixq (管理人)
あ~なるほど、そう言う事が起こる可能性がありますね。
私は今までそう言う事は想定しませんでした。

ただ私の数少ない経験上の話ですが、
処理落ちする時はそんな例えば10フレーム位も落ちる事は無く、
コンスタントに10フレームも落ちたりするようなゲームではそもそも遊べないと思います。
(何かの負荷がかかった瞬間多いフレーム数になることはあるかもしれませんが)

Aerobeatにどれ位処理落ちしたかを表示する機能を付けましたが、
カクカクになってしまう古いノートPCで動かしてみても、
やはりコンスタントに一律のフレーム落ちが発生し、
私が試した範囲では飛びぬけてあるフレームだけ沢山落ちる(ロードは除く)という事はありませんでした。

しかしちゃんとしたゲームを作るならJustyさんの仰ることは考慮すべきでしょうし、
否定するつもりは毛頭ないこと述べておきます。
私も今後の参考になりました。

ただ、この実装に手間がかかって挫折してしまいそうになることがもしあれば、
こういうケースはレアじゃないかという事を頭に入れて制作されてはどうかとコメントしました。

Re:フレームスキップ

Posted: 2009年12月11日(金) 01:06
by Justy

> 処理落ちする時はそんな例えば10フレーム位も落ちる事は無く

 それは仰る通りです。
 
 レアといえばレアですし、絶対に必要な処理というわけではありません。
 常に処理落ちている場合は考慮外で構わないと思います。
 仮にやるとしてもプライオリティを下げて、後回しにしても構わない類のものです。

 ただ、PCで実行している以上ユーザーの環境では裏でどんなソフトが動いているのか
わからないわけで、何かをトリガーにして眠っていたプロセスとかサービスが一瞬だけ動いて
ゲームにその間あまり処理が回らないということも考えられます。

(極端な例だと、とあるPCでは特定メーカーの USBメモリを差すと認識するまでの数秒間
マウスすら動かなくなることがありました。ここまでくると全くゲームになんか処理は
回らないのでどうにもならないですけど……)

 とはいえ、Dixqさんの仰る通り「まぁそういうこともあるかもね」くらいに考えて
おけばいい話ということで。