@JasonにFPSをキャップする必要があり、睡眠:
これはコメントになる予定だったが、それはあまりにも大きな成長し、それは私がちょうど与えたものと異なる[より良い]の答えです。上記の方法を採用することにより、ここ http://obviam.net/index.php/the-android-game-loop/
説明したように、私はこの方法を使用して、私の実装を変更した
あなたがOnTouchイベントを寝する必要はありませんを意味します。ここに述べたように
また、あなたのゲームループのスレッドを保護することを忘れないでくださいhttp://wonton-games.blogspot.com/2010/06/lunar-lander-resume-game-workaround.html
もまた、レプリカ島が言っ書くときにクリスPruettは、彼が2つのスレッド、更新のための1()および他のを使用したことを覚えておいてください
render()のためには、両方を保護する必要があります。
クリスはイベントをカットするために16ミリ秒(60fps)で彼のOnTouchを眠っています - それでもイベントをカットする必要がある場合は、実験に最適だと言います - 何かが起きている間は画面に触れるだけですそれが遅れているかどうかを確認して、次に離れるときにスピードアップします。
現在のところ私はOpenGLに進んでいないのと同じスレッドを使用していますが、私はまだキャンバスを使用しています。しかし、私がOpenGLに行くと、2つのスレッドになり、それぞれは完全なクラスになります。
最後に、フレーム数をカウントしてスプライトの時間を計ることはありません。タイマーでラップしました。私はクラスを共有し、私がそれをどのように呼び出すかを示します。私はJavaにまだ慣れていないので、コードが貧弱であることを謝ります。
package com.yourname.yourapplication;
//Used for doing something after a set time
public class TimeDo {
private int mRepeat = 0; //Stores the last wait period for the reset() later
private long mTime = 0; //The goal time of when its due
private boolean mFlagged = false; //Stop them getting a second true on a subsequent check
public TimeDo(int milliseconds) {
reset(milliseconds);
}
public TimeDo() {
this(0);
}
public void reset(int milliseconds) {
mRepeat = milliseconds;
mTime = System.currentTimeMillis() + milliseconds;
mFlagged = mRepeat==0; //ignore if zero
}
public void reset() { //Set it back to the delay used last time
reset(mRepeat);
}
public boolean check() {
if (mFlagged) //Assert: shouldn't really happen
return false;
mFlagged = System.currentTimeMillis() > mTime;
return mFlagged;
}
public boolean checkAndReset() {
if (check()) {
reset();
return true;
}
return false; //note mFlagged could be true here, so don't use it
}
}
そしてそれはthusly実装されています -
public class Gem {
private TimeDo mMoveGem = new TimeDo(100); //move 10 times a second, 100ms
private int mX = 0;
private int mY = 0;
private int mMoveX = 3;
private int mMoveY = 4;
.
.
.
public void update() {
if (mMoveGem.checkAndReset()) {
mX += mMoveX;
mY += mMoveY;
.
.
}
}
public void render(Canvas canvas) {
//etc etc
.
.
}
}
は、そのいずれかがお役に立てば幸い! 申し訳ありませんが、あなたのアプリケーションの多くを書き直す必要がある場合 - 私はしました。
編集:そのTimeDoクラスは、自動アラームのように、postDelayedの実行可能ではありません。 をチェックしない場合、にチェックすると「イベント」は発生しません。あなたは興奮して、実行可能ファイルを作成し、クラス内にあるコールバックメソッド(OnClickメソッドを考えてください)を渡すことができます。しかし、すべてのコンポーネントを更新するタイムアウト可能なupdate()スレッドを実行する目的を打ち破ります。
[なぜ私のAndroidフレームレートを破壊するタッチイベントですか?](http://stackoverflow.com/questions/792185/why-are-touch-events-destroying-my-android-framerate) – richq