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 毫秒运行一次,是预期时间的两倍!为什么会这样?我的线程是最基本和最简单的,我怀疑是否有什么可以延迟它

有没有更好的方法让它完全按照预期进行更新?

4

2 回答 2

2

处理器需要为线程切换内容。33毫秒有点低。

如果您使用 300 毫秒,这是一个可接受的值

handler.postDelayed();

如果您想要 30 fps,请尝试延迟 30 毫秒,而不是尝试 1 毫秒。

于 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();

shedule 文档在这里。与其他调度方法相比,这应该关注何时调度,但我忘记了我在哪里读到的。我希望其中一种方法对您有所帮助。

于 2012-09-15T13:40:39.030 回答