Android 開発者の皆様、こんにちは。
OpenGLES 1.0 を使用して、Eclipse で Android 用の簡単なゲームを開発しています。開発用デバイスとして Samsung Galaxy S2 Android(2.3) を使用しています。
デュアルコアとフレームレート一定化について質問です。
そのため、GLSurfaceView の作成を管理し、LogicUpdate(deltatime) 関数と Render() 関数を呼び出す onDrawFrame() 関数をオーバーライドしました。
はい、今のところすべてシングル スレッドです。
私が得ている問題は、デュアルコアにあります。[設定] -> [省電力] に移動してデュアル コアを無効にし、[システムの省電力] をチェックすると、レンダリングが 30 FPS で自動的にロックされることがわかります。しかし、[システムの省電力] のチェックを外してデュアル コアを有効にすると、レンダリングが 60 FPS でロックされていることがわかりますが、電話が熱くなり、バッテリーの消耗が非常に速くなります。
したがって、バッテリーを節約するために、ゲームを 30 FPS で実行し続けるという考えです。
これを行うには、以下のコードを使用します。
ロジックの更新を行う前に、このコードの平和を呼び出します。これはすべて onDrawFrame() で行われることを思い出してください。
if( CONST_FPS > 0 && StartTime > 0 )
{
/////////////////////////////////////////////////////////////////
// Get frame time
////////////////////////////////////////////////////////////////
long endTime = System.currentTimeMillis();
long time = endTime - StartTime;
//
long wantedtime = 1000 / CONST_FPS;
//
long wait = 0;
if( time < wantedtime )
{
wait = wantedtime - time;
//
Thread.sleep(wait);
}
else
{
//Time to big game will slow down
}
}
CONST_FPS = 30 の場合
その後
StartTime = System.currentTimeMillis(); //
UpdateLogic(1.0 / CONST_FPS);
Render();
主に FPS をロックする必要がないため、30 FPS でのゲームプレイは非常にスムーズです。しかし、60FPS を 30 FPS にロックしようとすると、どもりが発生します。私はいくつかの調査を行い、Thread.Sleep() が正確ではないことがわかりました。これは本当ですか?60FPS から 30FPS にロックする場合、ゲームプレイをよりスムーズにするために他に何ができますか?
答えてくれてありがとう...