問題タブ [game-loop]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 非同期ゲーム エンジン ループを実装するためのベスト プラクティスはありますか?
次のようにゲーム エンジン ループを実装しました。
私はAsyncResult
、Jeff Richter の記事「Implementing the CLR Asynchronous Programming Model 」で推奨されているクラスを使用しています。UI からエンジンを停止できるようにするために、私が使用した実装は、標準の非同期パターンから少し離れていました。この実装は期待どおりに機能しますが、標準的な慣行から逸脱した場合は、SO コミュニティに戻って、正しい方法で物事を行っていることを確認します。
この実装には、誰でも見ることができる問題はありますか?
android - SurfaceView を使用した Android gameLoop; カメラの「ショット」をすばやく変更すると、黒いフラッシュなどが発生します
SurfaceView を使用して簡単なゲーム エンジンを作成しました。
私は RectF を「カメラ」ウィンドウとして使用し、SurfaceView キャンバスのスケーリングされたピクセル幅と高さを表し、画面に何が表示されているかを把握します。
canvas.translate を使用して、カメラが「指している」場所に移動します。描画ループは次のとおりです。
いずれにせよ、発射物を発射すると、ゲームはスムーズにレンダリングされ、キャンバスをフラッシュするために使用している色である黒の視覚的な閃光は見られません.
ただし、カメラが見ることができるものを即座に変更すると、おそらく 3 つ以上の「画面」が離れていると、常にではありませんが、多くの場合、黒い閃光が発生します。時々私は「幸運」になり、移行はシームレスです.
1 つまたは 2 つのビットマップを使用して地面と背景を再帰的に描画するため、これらのフラッシュは通常ビットマップの位置にあります。
突然の変更が問題であると思われたので、基本的にgameLoopスレッドを破棄してすべてを停止し、新しいRect座標を設定してから別のスレッドで再起動しようとしましたが、これは機能しません.
振り返ってみると、私はこれを行うことでシステムへの「ショック」を遅らせただけであり、それを処理しなかったと思います。
おそらくフェードアウトやその他の視覚的なトリックによって、このおそらくひどいデザインを敷物の下に一掃しようとする前に、誰かがこの問題をより深く理解し、よりエレガントな解決策に導くことができるかどうか疑問に思っています.
game-loop - ループによってシミュレートされるゲームを行う方法
人々が繰り返しなければならないループによってシミュレートされるゲームをプログラムする方法は、それが正方形80に到達するか通過するのにかかる限り続くのでしょうか?私はスネーク&ラダーゲームをやっていて、これを可能にするコードを書く必要があります
events - ゲームループを備えた最大の牛肉
現代のゲームループについて最も嫌いなことは何ですか?ゲームループを改善することはできますか、それともイベント駆動型アーキテクチャなどのより良い代替手段がありますか?
ruby-on-rails - アプリケーションコントローラのRailsゲームループ?
私は RoR でゲームを書いているので、ページが更新されるたびにさまざまなことをチェックするゲーム ループが必要です。私の質問は、実装する最良の方法は何ですか?
現在、アプリケーション コントローラーに game_loop を含めています。これはベストプラクティスですか?
c - GLUTを使用したOpenGLの可変FPSに依存しない一定のゲーム速度?
さまざまなゲームループソリューションに関するKoenWittersの詳細な記事を読んでいますが、推奨されるものであるGLUTを使用して最後のソリューションを実装する際に問題が発生しています。
一定のゲーム速度を達成する方法に関する他の人々からのいくつかの記事、チュートリアル、およびコードを読んだ後、私が現在実装しているもの(以下のコードを投稿します)は、KoenWittersが可変FPSに依存するゲーム速度と呼んだものだと思います、彼の記事の2番目。
まず、私の検索経験を通して、おそらくこれを支援する知識を持っているが、GLUTが何であるかを知らない人が何人かいます。私は、関連する機能を説明しようとします(私を修正してください)。このOpenGLツールキットの私の問題。GLUTとは何か、GLUTの操作方法を知っている場合は、このセクションをスキップしてください。
GLUT Toolkit:
- GLUTはOpenGLツールキットであり、OpenGLの一般的なタスクを支援します。
- は、すべてのレンダリングを担当する関数コールバック
glutDisplayFunc(renderScene)
へのポインタを取ります。renderScene()
このrenderScene()
関数は、コールバック登録後に1回だけ呼び出されます。 - は
glutTimerFunc(TIMER_MILLISECONDS, processAnimationTimer, 0)
、コールバックを呼び出す前に通過するミリ秒数を要しますprocessAnimationTimer()
。最後の引数は、タイマーコールバックに渡す値です。はそれぞれではなく、一度だけprocessAnimationTimer()
呼び出されます。TIMER_MILLISECONDS
- この
glutPostRedisplay()
関数はGLUTに新しいフレームをレンダリングするように要求するため、シーン内で何かを変更するたびにこれを呼び出す必要があります。 - にコールバックを登録するために使用
glutIdleFunc(renderScene)
できますがrenderScene()
(これは無関係にはなりませんglutDisplayFunc()
)、イベントが受信されていないときにアイドルコールバックが継続的に呼び出され、CPU負荷が増加するため、この関数は避ける必要があります。 - この
glutGet(GLUT_ELAPSED_TIME)
関数は、glutInit
呼び出されてからのミリ秒数(またはの最初の呼び出しglutGet(GLUT_ELAPSED_TIME)
)を返します。これがGLUTのタイマーです。高解像度タイマーのより良い代替案があることは知っていますが、今のところこれを維持しましょう。
これは、GLUTがフレームをレンダリングする方法についての十分な情報であると思います。そのため、GLUTについて知らなかった人も、この質問に答えて、気に入らなかった場合に助けてもらうことができます。
現在の実装:
さて、Koenによって提案された2番目のソリューションである可変FPSに依存するゲーム速度を正しく実装したかどうかはわかりません。そのための関連コードは次のようになります。
この実装は正しくありません。これは、ゲームの速度をFPSに依存して一定にするのに役立つという意味で機能します。そのため、ポイントAからポイントBへの移動には、高/低フレームレートに関係なく同じ時間がかかります。ただし、このアプローチではゲームのフレームレートを制限していると思います。[編集:各フレームは、タイムコールバックが呼び出されたときにのみレンダリングされます。つまり、フレームレートはおよそTICKS_PER_SECOND
1秒あたりのフレーム数になります。これは正しくないと感じます。強力なハードウェアを制限するべきではありません。間違っています。ただし、まだ計算する必要があることは私の理解ですelapsedTime
。GLUTにタイマーコールバックを毎回呼び出すように指示しているからといってTIMER_MILLISECONDS
、それが常に時間どおりに行われるとは限りません。]
どうすればこれを修正できるかわかりません。正直に言うと、GLUTのゲームループが何であるかわかりません。Koenwhile( game_is_running )
の記事のループです。[編集: GLUTはイベント駆動型であり、電話をかけるとゲームループが開始することを理解していますglutMainLoop()
(これは決して戻りません)、そうですか?]
アイドル状態のコールバックをに登録し、glutIdleFunc()
それをの代わりに使用してglutTimerFunc()
、必要な場合にのみレンダリングできると思いました(通常のように常にではなく)が、これを空のコールバック(のようにvoid gameLoop() {}
)でテストしたところ、基本的に何も行われず、画面が黒い場合、CPUは25%に急上昇し、ゲームを終了して通常に戻るまでそこに留まりました。だから私はそれがたどる道ではないと思います。
glutTimerFunc()
ゲームをクールではなく一定のFPSに制限しているため、使用することは、それに基づいてすべての動き/アニメーションを実行するための良いアプローチではありません。または、間違って使用していて、実装が正しくない可能性がありますか?
可変FPSで一定のゲーム速度をどの程度正確に得ることができますか?より正確には、GLUTを使用してKoenのConstant Game Speed with Maximum FPSソリューション(彼の記事の4番目のソリューション)を正しく実装するにはどうすればよいですか?たぶんこれはGLUTではまったく不可能ですか?そうでない場合、私の選択肢は何ですか?GLUTを使用したこの問題(一定のゲーム速度)への最善のアプローチは何ですか?
[編集]別のアプローチ:
私は実験を続けてきましたが、これが私が今達成できたことです。時間指定関数(ゲームのフレームレートを制限する)で経過時間を計算する代わりに、現在はで計算していますrenderScene()
。シーンに変更が発生するたびにglutPostRedisplay()
(つまり、カメラの移動、オブジェクトアニメーションなど)、を呼び出しますrenderScene()
。この機能の経過時間を使って、例えばカメラを動かすことができます。
私のコードはこれに変わりました:
結論として、それは機能している、またはそう思われます。カメラを動かさない場合、CPU使用率は低く、何もレンダリングされていません(テスト目的では、グリッドは4000.0fに拡張されていますが、zFarは1000.0fに設定されています)。カメラを動かし始めると、シーンはそれ自体を再描画し始めます。移動キーを押し続けると、CPU使用率が高くなります。これは正常な動作です。動かなくなると元に戻ります。
私が何かを逃していない限り、それは今のところ良いアプローチのようです。私はiDevGamesでこの興味深い記事を見つけました。この実装は、おそらくその記事で説明されている問題の影響を受けています。それについてどう思いますか?
私はただ楽しみのためにこれをしていることに注意してください。少なくとも近い将来ではなく、配布するゲームなどを作成するつもりはありません。もしそうなら、私はおそらくGLUT以外のものを使うでしょう。しかし、私はGLUTを使用しているので、iDevGamesで説明されている問題以外は、この最新の実装でGLUTに十分だと思いますか?私が今考えることができる唯一の本当の問題はglutPostRedisplay()
、シーンが何かを変えるたびに電話をかけ続け、再描画する新しいものがなくなるまで電話をかけ続ける必要があるということです。より良い原因のためにコードに少し複雑さが加わったと思います。
どう思いますか?
c++ - ゲームループのタイマーを作るには?
fpsカウントの時間を計り、制限を60に設定したいのですが、Google経由でいくつかのコードを見てきましたが、完全にはわかりません。
windows - OSタイマーでゲームループを処理する
単純なゲームループは次のように実行されます。
(この質問から引用)
ここでは、例としてWindowsを使用していますが、どのプラットフォームでもかまいません。私が間違っている場合は訂正してください。ただし、このようなループは常にrunning
変数の状態をチェックしているため、CPU /コアの100%を使用します(コンピューターの1つのコアの50%を使用します)。
私の質問は、OS(Windowsの例)のタイマー関数を使用してゲームループを実装し、1秒あたりに必要なゲームロジックのティック数に応じて必要な間隔を設定する方が(パフォーマンス的に)優れているでしょうか?タイマー機能はCPUのRTC割り込みを使用すると想定しているので、これを尋ねます。
java - ゲームループのJavaTimerTickイベント
java.util.Timerのタイマーを使用してJavaでゲームループを作成してみました。タイマーティック中にゲームループを実行できません。この問題の例を次に示します。ゲームループ中にボタンを動かそうとしていますが、タイマーティックイベントでボタンが動いていません。
animation - 実用的なゲームアニメーション?
ゲーム開発には、シーンが描かれる「ゲームループ」が含まれることを理解しています。このゲームループは、可能な限り高速に実行されるか(タイマーなし、フレームアニメーション)、タイマーに基づいて呼び出されます(タイマーアニメーション)。キャラクターの歩行など、フレームがいくつ発生するかを考えると、高度なアニメーション(単純なジオメトリを超えたもの)が実際にどのように実行されるのか興味があります。明らかに、プログラマーはアニメーションのすべてのフレームでキャラクターの足の位置をハードコーディングしていないので、これが実際にどのように行われるのだろうかと思います。
質問の明確化が必要な場合は、さらに記入させていただきます。