Android アプリでフレームレートを調整するにはどうすればよいですか? ゲームを一定の速度で実行したいと思います。私のアプリは高いフレームレートを必要としないので、必要以上にバッテリーを消費するので、必要ありません。
1 に答える
フレームレートを使用して時間を測定しないでください。time を使用して時間を測定します。GC パスには 3/10 秒かかる場合があり、他のタスクはバックグラウンドで起動する場合があります。
あなたが可能だと思っていたよりも遅く実行されるシステム/セットアップが常にあります.
次に、速度をピクセルではなく、ピクセル/秒で指定します。アニメーションの各フレームには一定の時間がかかります。ゲーム エンジンでは、次のフレームを計算するときに、入力の 1 つに「最後のフレームから経過した時間」があります。その値を秒の分数として決定し、速度/秒をその分数で掛けます。結果は、与えられたモノが最後のフレームからどれだけ移動したかです。
非常に遅いフレーム レートは、特に高速で移動するオブジェクトの場合、衝突検出に大混乱をもたらす可能性があることに注意してください。モノ 1 がフレーム間でモノ 2 を完全に通過する場合、BBoxes または半径をチェックするだけではそれをカットできません。
そうは言っても、sleep() はあなたの友達です。フレームの処理の開始時に、 を呼び出しますSystem.currentTimeMilis()
。フレームの処理 (レンダリングを含む) の最後に、現在の時刻を再度確認します。差が十分でない場合は、目的のフレーム レートに一致するのに十分な時間、sleep(N) します。
したがって、最大 20 fps が必要な場合は、各フレームに 50 ミリ秒かかる必要があります (1000 ミリ秒 / 20 = 50 ミリ秒)。フレームのシミュレーションとレンダリングに 10 ミリ秒しかかからなかった場合、次のフレームに移る前にさらに (50 ミリ秒 - 10 ミリ秒 = ) 40 ミリ秒スリープする必要があります。
または、シミュレーションを可能な限り高速に実行し続け、画面を頻繁にレンダリングするだけにすることもできます。これはバッテリーの寿命にはあまり役立ちませんが (ただし、Evo からの熱が何らかの兆候である場合、OpenGL ハードウェア アクセラレーションは高価です)、非常にスムーズなエクスペリエンスを実現できます。その時点で、モーション ブラーなどの計算を開始できます。