postDelayed函数比指定的速度快4倍

时间:2014-08-25 17:53:35

标签: android

我正在尝试使用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)
        }
    }
};

1 个答案:

答案 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毫秒,您将会看到明显的口吃。