掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
フレームレートを維持して描画する方法は? (ID:5062)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
シミュレーションゲームを作成中なのですが、ちょっと悩んでいます。 1. 座標を計算するためにタイマーを使って1/30秒ごとに演算を行う。 2. 計算結果の数値を使って画面を描画する。 1は問題なくできるのですが、2をどう実現させようかと思いまして・・・。 「最高30fpsとして、できるだけ高フレームレートで表示できるように努力する」 方法を探しています。 まず「Application.OnIdleを使って暇なときに描画」を考えつきました。 しかし、キーリピートが発生すると負荷が高くなるせいか、一時的ですが描画が 完全停止してしまい、ちょっとゲームに使うには・・・でした。 次に、サブスレッドを生成し、メインで数値計算、サブで描画をさせる方法を考えました。 サブスレッドは、下記のように暇さえあればひたすら描画を行うようにしてみました。 while not terminated do begin start := timegettime; if メインで計算された座標が更新されていたら then Synchronize(座標); stop := timegettime; writetime := stop - start; if (writetime < 33) then sleep(33 - writetime); // 描画が33msより早かったら、30fpsを超えないように休憩 sleep(0); // もしスライスされた時間が余ってたらメインスレッドに譲ります end; そして、Synchronize内でメインFormに対してDirectDrawで描画命令を出しています。 しかし、この方法で最初はうまくいくのですが、描画が忙しくなってくると Drawが数秒おきに一瞬停止し、カクカク動くようになってしまいました。 複数のPCで試したのですが、スペックに関係なく描画がスムーズだったり、 カクカクで使い物にならなかったりして、原因が掴めないでいます。 いちばん時間がかかる描画処理をSynchronize経由メインスレッドでやっているので、 サブスレッド化する意味自体無いのでしょうか・・・。参考までに、sleep(0)を外すと メインスレッドのタイマーも遅延でガタガタになってしまいました。 もし、他に素敵なアイデアがありましたら是非お教えください。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.