HTC Wildfire Sで一定の平均60 FPSで画面をレンダリングするゲームの飛行機の狂気を見ました。私は同じスマートフォンで結果を真似しようとしていましたが、なぜ私のプログラムのみを理解できません平均15FPSを上回っていますか?Android Game Loop:平均で60FPSに達するには?
飛行機の狂気のフレームレートはどのように表示されますか?設定にFPSカウンターを切り替えるオプションがあります。私は鉱山をENABLEDに設定しました。
ここに私のコードです。これは私のゲームのループです。このことから、いくつかの興味深い結果があります。
public void run() {
// Average FPS for Android is 15 on Test Phone is 13 through 15.
// Max FPS is 20.
// Occasional bursts of FPS60 may occur.
long now, lastTime = System.nanoTime();
double process = 0.0;
final double NSperTick = 1000000000.0/60.0;
while (running) {
now = System.nanoTime();
process += (now - lastTime)/NSperTick;
lastTime = now;
boolean ticked = false;
while (process >= 1) {
process -= 1;
tick();
ticked = true;
}
if (ticked) {
render();
}
swap();
try {
Thread.sleep(2);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
誰もが、私は60 FPSの平均値を得ることができるように、など、改善する必要があるもの、私が間違ってやっているものを私に伝えることができますか?このゲームのループは、Java(Androidではなく)で動作しているときには実用上問題ないので、スマートフォンのフレームレートにどのようなロジック部品が影響しているのかよくわかりません。
ありがとうございます。
EDIT:すべての機能をManに知らせる必要があるように見えます。
private void render() {
synchronized (holder) {
if (holder.getSurface().isValid()) {
Canvas c = holder.lockCanvas();
c.drawRGB(0x44, 0x55, 0xff);
ball.render(c);
holder.unlockCanvasAndPost(c);
}
}
}
private void swap() {
}
private void tick() {
float[] values = {meter.X, meter.Y, meter.Z};
ball.tick(values);
handler.tick(ball);
}
そして、ここで私は私のゲームの平均FPSをご確認方法は次のとおりです。
03-12 14:29:21.008: D/FrameRate(3533): 14
03-12 14:29:22.061: D/FrameRate(3533): 15
03-12 14:29:23.048: D/FrameRate(3533): 14
03-12 14:29:24.033: D/FrameRate(3533): 14
03-12 14:29:25.018: D/FrameRate(3533): 14
03-12 14:29:26.000: D/FrameRate(3533): 14
03-12 14:29:27.056: D/FrameRate(3533): 15
03-12 14:29:28.047: D/FrameRate(3533): 14
03-12 14:29:29.026: D/FrameRate(3533): 14
03-12 14:29:29.995: D/FrameRate(3533): 14
03-12 14:29:31.037: D/FrameRate(3533): 15
03-12 14:29:32.015: D/FrameRate(3533): 14
EDIT 2:より多くの情報があります:
public void run() {
// Average FPS for Android is 15 on Test Phone is 13 through 15.
// Max FPS is 20.
// Occasional bursts of FPS60 may occur.
long now, lastTime = System.nanoTime();
int frames = 0;
double process = 0.0;
long frameTime = System.currentTimeMillis();
final double NSperTick = 1000000000.0/60.0;
while (running) {
now = System.nanoTime();
process += (now - lastTime)/NSperTick;
lastTime = now;
boolean ticked = false;
while (process >= 1) {
process -= 1;
tick();
ticked = true;
}
if (ticked) {
//render();
frames++;
}
swap();
try {
Thread.sleep(2);
}
catch (InterruptedException e) {
e.printStackTrace();
}
if (frameTime <= System.currentTimeMillis() - 1000)
{
Log.d("FrameRate", Integer.toString(frames));
frameTime += 1000;
frames = 0;
}
}
}
そしてここでは、DDMSからの結果は、私はrender()関数でこのコードをコメントアウトしました:
synchronized (holder)
しかし、私は14~15FPSしか達成できません。これは私が突破することができない限界ですか?
'render()'を呼び出さないとどうなりますか?それはあなたが無視しているような明白なことです。レンダリングにはあなたの時間よりも時間がかかるかもしれません。 – unwind
tick()、render()、swap()のメソッドを見ずに私を助けることはできません –
@unwind tick()、render()、swap()の情報を追加しました。レンダリング()でオブジェクトボールを呼び出したことに気付きました。私はその上の機能を拡張するべきですか? –