减慢对特定功能的调用

时间:2013-07-28 11:58:03

标签: java methods

我在这里有一个游戏循环,它调用了tick方法。在tick方法中,调用其他tick方法。如何在不降低整个程序速度的情况下减慢对input.tick()的调用?在tick方法中放置Thread.sleep();会减慢整个程序的速度,这不是我想要的。

public void run() {
    long lastTime = System.nanoTime();
    long timer = System.currentTimeMillis();
    final double ns = 1000000000.0 / 60.0;
    double delta = 0;
    int frames = 0;
    int ticks = 0;

    while(running){
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;

        while(delta >= 1){
            tick();
            ticks++;
            delta--;
        }
        render();
        frames++;

        if(System.currentTimeMillis() - timer > 1000){
            timer += 1000;
            System.out.println(ticks + " tps, " + frames + " fps");
            ticks = 0;

            frames = 0;
        }
    }
    stop();
}

  public void tick(){
    input.tick(); // How do I slow down the call to this?

    if(gameState){
        player.tick();
        player.move();
        collision();
        treeline.move();
        obstacleHole.move();
        obstacleWolf.move();
        coin.move();
        coin.tick();
}
}

3 个答案:

答案 0 :(得分:2)

您似乎正在执行GUI应用程序,并且您显示的代码在Event Dispatch Thread上运行。 sleep使EDT冻结,无法更新GUI。你必须做的是使用javax.swing.Timer类推迟执行代码。

如果您希望定期tick,则只需在提交给Timer的处理程序中重新安排同一任务。

答案 1 :(得分:1)

使用线程以延迟方式调用tick(),如下所示:

private static final Timer TIMER = new Timer();

// ...

public void tick(){

    TIMER.schedule(new TimerTask(){

        void run() {
            input.tick(); // Your tick method
        }


    }, 1000 /* delay in milliseconds */)

    // ... rest of your method

}

答案 2 :(得分:1)

如果input.tick()方法收集播放器的输入(例如按键),则延迟它似乎不合适。

也许您可能对实现键盘输入轮询机制感兴趣。 (有关示例,请参阅here)。

这是游戏中的常用技术,因此您不会像通常的方式那样响应播放器的输入。相反,您收集所有用户输入,例如在队列中,然后您轮询该队列以您自己的速度读取输入(例如每秒30次)。

我希望它有所帮助