1

私はこの小さなコードを作成しました:

public class Game1Activity extends Activity {

/** Called when the activity is first created. */
private final Handler handler = new Handler();  
private final Runnable run = new Runnable() 
{
    public void run(){
        update();
    }
};


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    update();
}

public void update(){
    try 
    {
        Log.i("update thread", "updated");
    }
    catch (Exception  e)
    {
        Log.i("update thread", "catched an exception!");
    }
    finally 
    {
        handler.postDelayed(run, 33);
    }
  }
}

ご覧のとおり、 33 ミリ秒 (30 fps) ごとに更新されたログ チャットに書き込むこと以外に特別なことはありません。

ログチャットからわかる場合、ここに私の問題があります:

09-15 09:01:05.955: I/update thread(423): updated
09-15 09:01:06.025: I/update thread(423): updated
09-15 09:01:06.097: I/update thread(423): updated
09-15 09:01:06.166: I/update thread(423): updated
09-15 09:01:06.236: I/update thread(423): updated
09-15 09:01:06.305: I/update thread(423): updated
09-15 09:01:06.374: I/update thread(423): updated
09-15 09:01:06.444: I/update thread(423): updated
09-15 09:01:06.513: I/update thread(423): updated

スレッドは約 70 ミリ秒ごとに実行され、意図した時間の 2 倍になります。なぜそれが起こるのですか?私のスレッドは最も基本的でシンプルです。それを遅らせることができるものがあるかどうかは疑問です

意図したとおりに更新するためのより良い方法はありますか?

4

2 に答える 2

2

プロセッサは、スレッドの内容を切り替える必要があります。33 ミリ秒は少し低いです。

300 ミリ秒を使用する場合、それは許容できる値です。

handler.postDelayed();

30 fps が必要な場合は、1 ミリ秒で試すよりも 30 ミリ秒の遅延を試してみてください。

于 2012-09-15T09:12:43.740 に答える
0

最近、ソフトウェアコード部分でこのコードを使用しました。

this.timer.scheduleAtFixedRate(new TimerTask() {
   public void run() {
      //do something here: probably update();
   }
}, 0L, this.INTERVAL);

同じ遅延である必要があります。

編集:

import java.util.Timer;
import java.util.TimerTask;

..。

private Timer timer = new Timer();

シェドゥルのドキュメントはこちらです。他のスケジューリング方法と比較して、これはいつスケジュールされるかに焦点を当てるべきですが、私はそれをどこで読んだかを忘れました。この方法の1つがお役に立てば幸いです。

于 2012-09-15T13:40:39.030 に答える