問題タブ [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.
game-loop - Single threaded game and rendering
I'm writing single threaded game engine for 2D games. Right now my game loop looks rougly like this:
- Update game logic
- Update physics
- Handle collisions
- Render scene
I'm using OpenGL for rendering. I'm wondering about 'Render scene' step position in game loop. There is a SwapBuffers() call on the end of the 'Render scene' step, so CPU is blocked until all rendering is finished. What do you think about this game loop:
- Render scene (previous frame)
- Logic, physics, collisions
- Swap buffers
This approach will bring better parallelism between CPU and GPU. Am I right?
java - ゲームループフレームに依存しない
ゲームループをできるだけ速く実行することは許可されていますか?現在、希望のfpsを設定できるため、ゲームの出荷先のすべてのデバイスで一定のfpsを使用できます。しかし、より高速なモバイルデバイスでは、より滑らかなグラフィックスを使用したほうがよいでしょう。フレームに依存しない更新を確認しました。フレームに依存しない更新を使用する場合、(目的のfpsを達成するために)しばらく一時停止する必要はなく、ゲームスレッドで更新とレンダリングに時間がかかる場合は、更新してレンダリングしない必要はありませんか?片付けてください。
loops - Cocos2D ゲームループの説明
注: 私は英語のネイティブ スピーカーではありません。文法の間違いはご容赦ください。
左側にシューターがいて、右側から敵が来るシンプルなゲームを開発しました..とてもシンプルです。
プロジェクトはほぼ完成し、完璧に動作しますが、ゲーム ループの管理に疑問を感じています。
スケジューラに間隔を与えて右から出現する敵をスケジュールしましたが、問題はありませんが、単純な ccMoveTo アクションで右から左への敵の移動を管理しました。繰り返しますが、完全に機能します。問題は、この操作をフレームごとに 1 回実行されるスケジュールされたメソッドに委譲する「すべてのフレームでスプライトをレンダリングする」について何かを読んだことです..
より良い: アクションを使用してスプライトを移動するのではなく、1/60 周波数 (fps 周波数) で呼び出されるスケジュールされたメソッドで動きをシミュレートするフレームごとにそれらを再レンダリングすることについて読んだところ、この実装が防止できることを読みました異なるハードウェアシステムでの安定性の違い..
私が尋ねるのは:
- それは進むべき正しい方法ですか?
- それは Cocos2D で廃止された古い「デザイン パターン」ですか? (これは、ccMoveTo アクションの使用が完全に完璧であることを意味します)
- または、両方の実装が同じレベルで正しいですか?
編集:
――アニメーションにも同じ手法を使うべきですか?
javascript - フレームレートで許可されている場合にのみ、html5キャンバスで特殊効果をレンダリングする
ゲームループを次のように設定します。
ここで私がやりたいのは、effectsOn
フレームレートが良好なために変数が設定されている場合、ゲームでいくつかの特殊効果をレンダリングすることです。そうでない場合は、これらの特殊効果のレンダリングをスキップします。
しかし、私の明らかな問題は、ifdt>1/60
とeffectsOnがtrueに設定されていることです。レンダリング時間が長くなる特殊効果をレンダリングするdt < 1/60
ので、effectsOnをfalseにする可能性があります。
私がやろうとしていることを達成するための良い代替方法はありますか?
最悪の場合、メインメニューにチェックボックスのようなものを配置して、ユーザーに特殊効果をレンダリングするかどうかを決定させることができます...
c++ - ゲームループのフレームレート制御の問題
とにかく、これはいつもの話で、私の非常に単純なゲームで、それを実行するすべての Windows マシンで同じ速度を保証しようとして、私を怒らせています。1/60 値を指定することでそれを行い、最後に呼び出されてからその値が経過するまでフレームが実行されないようにします。私が抱えている問題は、何らかの理由で 1/60 が 30hz に等しいことです。60hz を取得するには、1/120 に設定する必要があります。また、60hz の強打ではなく、少し高速です。
ここに貼り付けたら、何か問題があるかどうか教えてもらえますか? またはそれを行うためのより正確な方法はありますか?
android - フレームごとにキャンバス上のすべてのオブジェクトを再描画する必要がありますか?
ゲームループを設定しています。ループは 50 FPS で更新するように設定されています。現在、アプリが実行する唯一のアクションは、タッチ イベントに応答して画面座標を描画することです。最初は、新しいタッチ イベントのみを描画するように描画機能を設定しました。これにより、テキストが点滅しました。複数のタッチ イベントが異なるタイミングで点滅するため、Canvas はバックグラウンドで複数のページを使用していると思われます。これを回避するために、発生したすべてのタッチ イベントのリストを作成し、ドロー コールごとにリスト全体を再描画しました。
間違っている場合は訂正してください。lockCanvas()/unlockCanvasAndPost() 呼び出しは、本質的にバックバッファ スワップです。ロックとロック解除に関するドキュメントを読むと、lockCanvas(Rect dirty) を使用しない限り、呼び出しの間にシーン全体を再描画する必要があるように思えます。この場合、外側の領域を保持したまま、ダーティな rect 領域を再描画する必要があります。
サーフェスのコンテンツは、unlockCanvas() と lockCanvas() の間で保持されることはありません。このため、サーフェス領域内のすべてのピクセルを書き込む必要があります。このルールの唯一の例外は、ダーティな四角形が指定された場合です。この場合、ダーティでないピクセルが保持されます。
自分の質問に答えたように聞こえますが、ドキュメントによると、Surface は呼び出し間で保持されることはありません。ただし、これは私の最初の実装の動作を説明していません。つまり、画面をタップするとテキストが点滅し始めました。テキストを 1 回だけ描画したので、これは、drawText() 呼び出しを取得しなかった「バックバッファー」と、破棄されなかった元の Surface へのスワップが原因で点滅していることを意味しますが、おそらく考慮される必要があります。信頼できない。
では、質問: 各描画呼び出しですべてのオブジェクトを再描画する必要がありますか? もしそうなら、キャンバスを「クリア」するか、少なくとも背景画像も再描画する必要がありますか?
iphone - NSTimer と CADisplayLink の競合
ゲームのメイン ゲームループとして CADisplayLink を使用し、10 秒ごとに敵を生成する NSTimer を使用しています。私が使う...
...ゲームループを一時停止しますが、敵をスポーンするタイマーは、ゲームが一時停止した後でも続行されます。タイマーを破棄してから別のタイマーを作成すると、一時停止ボタンを悪用して、ゲームの前に押すだけで済みません。 10 秒経過すると、敵がスポーンしなくなりますか? これに対する簡単な解決策はありますか?
java - Android Gameloop:ゲームを終了してアクティビティを開始する
Androidプロジェクト(最初のAndroidプロジェクト)のGameLoopに問題があります:
GameView(SurfaceView)が開始するアクティビティがあります。
GameView(SurfaceView)はGameThreadを開始します。
そして今、私は遊ぶことができます。この時点まで、すべてがOKです。
プレーヤーが新しいアクティビティ(GameOver)を失った場合、開始され、GameThreadが停止します。ここで彼は墜落します!
それがフリーズした後gameLoop.join();
。
私はたくさん試しましたが、何もうまくいきませんでした。よろしくお願いします
c++ - 2D ゲーム マップの移動
30 個の配列に格納されたブロック (40 x 40 の四角形) で構成されたプラットフォーマー用のランダムに生成された 2D マップがあります。ブロックを移動するプッシュ関数があり、プッシュによって xpos と配列上の位置が変更されます。配列の 5 ~ 25 の位置を描画するだけです。
私が移動するときは、画面の前半のキャラクターだけを移動します。そのため、画面の中央部分と 0xpos の間に衝突があります。現在、問題はブロックを移動することです。
自然に見えるように動かす方法が思い浮かびません。それを行う方法についてのアイデアはありますか?これまでのところ、キャラクターが40ピクセル相当の速度に相当する画面の片側に衝突するたびに、ブロックを押して別のブロックをランダムに生成するようにしています.
java - Java と Swing とゲーム ループ
(そうではない)ここで短い質問。私は、コンソールではなく UI として Swing を使用して単純なローグライクを作成することに取り組んでいます (これにより、特に Eclipse での作業が容易になります) が、障害にぶつかったようです。
困っているのは、ゲーム ループに入ると UI が正しく表示されないことです。全体を通して「ソリティア」効果を与える醜いウィンドウフレームが表示され、実行中にRAMの使用量が急速に増加します。
ここで Swing について何か重要なことを見逃していますか? これを行うには Swing の同時実行設定を使用する必要がありますか? もしそうなら、最善のアプローチは何でしょうか?
完全なコードは以下のとおりです。