1

SFML でフレームに依存しない動きを実装しようとしていますが、うまく動作しません。以前に SDL でこの問題が発生したとき、(タイトル バーをドラッグして) アプリケーションを移動するたびに Windows がアプリケーションのメイン スレッドを一時停止することを発見しました。ウィンドウをドラッグすると時計が更新されますが、ウィンドウを離すまで動きが描画されないため、問題が発生します。ウィンドウを移動すると、ウィンドウは描画されなくなりますが、時間はまだ増加しています。したがって、ウィンドウから手を離すと、ユニットは、ウィンドウがドラッグされていなかった場合の場所にすぐにジャンプします。

解決策を考えてみたところ、Windows はメイン スレッドを一時停止するだけなので、ゲーム全体を別のスレッドで実行し、main() で起動することだけを検討しましたが、同じ結果が発生するため、うまくいかないようです。結果として得られる非常に低い FPS についても考えましたが、誰かがウィンドウをドラッグしているのか、ゲームが自然にゆっくりと実行されているのかを区別する方法はありません...どちらかの方法が必要です.ウィンドウがメインスレッドを一時停止したり、この問題を防ぐ何かを実行したりするのを防ぎますが、インターネット上で解決策は見つかりませんでした...

問題を示す zip ファイルへのリンクを次に示します。Demo0 と Demo1 はどちらも同じですが、Demo1 が 2 番目のスレッドを使用してプログラムを実行しますが、同じ効果が発生します。両方を実行して、デルタ値がコマンド ラインに出力されるのを確認するだけです。次に、ウィンドウをドラッグして、画面の別の場所に移動します。手を放すと、非常に大きなデルタ値が表示され、ウィンドウを中断していた時間に応じて円が前方にジャンプするはずです。ソースコードはすべて(「src」フォルダーにあります)あるので、人々が正確な問題を理解できることを願っています:http://www.sendspace.com/file/4er8f4

4

1 に答える 1

2

この問題には 2 つの解決策があります。

sf::Events の LostFocus または Resized がウィンドウのドラッグを拾うかどうかを確認することができます。そうであれば、ゲームのクロックを一時停止してください。詳細については、http ://www.sfml-dev.org/tutorials/2.0/window-events.php を参照してください。

ただし、それがうまくいかない場合は、デルタに上限を追加するだけです。つまり、ゲームがデルタの特定のしきい値 (1/60 または 1/30) を超えた場合、デルタをより低い値に設定します。ただし、あなたの状況では、この上限はおそらく 1/15 のように非常に大きくなる可能性があります。

if(delta > 1/15.0f)
    delta = 1/15.0f;

いずれにしても、ゲームが 15 fps でプレイできるとは思わない可能性があります。ユーザーが移動中にウィンドウをドラッグした場合、対処しなければならない最悪の事態は、再開時に 15 fps のデルタになることです。

于 2013-06-13T16:45:01.807 に答える