我正在尝试使用postDelayed()每100ms更新画布,然后使invalidate()(再次调用onDraw)更新画布,但由于某种原因,它将更新30-50ms。每次调用onUpdate()函数时,我都会打印出调试消息,并且时间戳间隔30-50ms。为什么它比我想要的速度快得多?通常,您希望使用延迟运行的函数比您指定的慢。
private int FRAME_RATE = 100;
protected void onDraw(Canvas c) {
onDrawAnimation(c);
// Delay the next update by FRAME_RATE milliseconds
_h.postDelayed(_game_loop, FRAME_RATE);
}
private Runnable _game_loop = new Runnable() {
@Override
public void run() {
if (!_paused) {
onUpdate(); // Update locations/speed
invalidate(); // Update visuals (ends up calling onDraw)
}
}
};
答案 0 :(得分:3)
这样做。
private Runnable _game_loop = new Runnable() {
@Override
public void run() {
_h.postDelayed(_game_loop, FRAME_RATE);
if (!_paused) {
onUpdate(); // Update locations/speed
invalidate(); // Update visuals (ends up calling onDraw)
}
}
};
另外,请勿忘记删除所有延迟回调:
public void onPause(){
_h.removeCallbacks(_game_loop);
// or _h.removeCallbacksAndMessages(null);
// to remove everything
}
您可能希望以不同方法分隔onUpdate()
和invalidate()
,并以不同的间隔调用它们。
通常,您需要比游戏逻辑更频繁地更新视觉效果,并且您希望尽可能保持视觉刷新的轻量级。在您的代码中,如果您执行的操作时间超过100毫秒,您将会看到明显的口吃。