J2ME中节省时间的Gameloop

时间:2009-06-18 03:36:47

标签: java java-me game-loop

我已经完成了一系列关于J2ME游戏开发的问题,在最近的一篇中,Neil Coffey发表了评论

  

作为一个侧面问题 - 你真的想要吗?   在J2ME游戏中做100个滴答/秒?   正如我想的那样,你提到了   应该真的睡到下一个   想要的唤醒点,不是固定的   每次持续时间。

出于某种原因,那件事情在我脑海中浮现,现在我想要答案,我需要做什么才能使我的游戏循环睡眠到所需的唤醒点,我真的不知道那点是xD(理论上讲)。

为了反馈,这是我的游戏循环的简化版本:

public void run() {
    Graphics g = this.getGraphics();
    while (running) {
        long diff = System.currentTimeMillis() - lastLoop;
        lastLoop = System.currentTimeMillis();
        input();
        this.level.doLogic();
        render(g, diff);
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            stop(e);
        }
    }
}

感谢您的帮助!!

2 个答案:

答案 0 :(得分:3)

如果您还没有阅读过,那么有一篇关于游戏循环here的优秀文章。

根据我编写J2ME游戏的经验,你会希望尽量减少你在游戏循环中做多少事情,因为写得不好的游戏循环会很快耗尽手机的电池电量。也就是说,如果你要渲染10毫秒,请务必检查是否有任何变化,如果没有,请跳过它。

答案 1 :(得分:1)

如果你决定每10毫秒渲染一次,那么你:

loop {
  - record current time; render
  - do input/logic
  - check the current time, and calculate elapsed time
    - if less than 10 ms has elapsed, calculate the remaining time (10 millis - elapsed time); sleep for this duration
}

我知道定时器解析可能存在问题(例如,Thread.sleep(10)可能无法正好睡眠10毫秒;而System.currentTimeMillis()可能无法返回粒度低至1毫秒的结果)。这取决于平台。