Java J2ME中的时间高效的Gameloop

Java J2ME中的时间高效的Gameloop,java,java-me,game-loop,Java,Java Me,Game Loop,我已经回答了一系列关于J2ME游戏开发的问题,在最近的一个问题中,NeilCoffey评论道 作为一个次要问题-你真的想要吗 在J2ME游戏中每秒执行100次滴答? 正如我想某人提到的,你 真的应该也睡到下一个 所需的唤醒点,而不是固定的 每次持续时间 出于某种原因,这件事一直萦绕在我的脑海中,现在我想要答案,我需要做什么才能让我的gameloop睡眠到想要的唤醒点,理论上说,我真的不知道xD点在哪里 为了便于反馈,这是我的gameloop的简化版本: public void run() {

我已经回答了一系列关于J2ME游戏开发的问题,在最近的一个问题中,NeilCoffey评论道

作为一个次要问题-你真的想要吗 在J2ME游戏中每秒执行100次滴答? 正如我想某人提到的,你 真的应该也睡到下一个 所需的唤醒点,而不是固定的 每次持续时间

出于某种原因,这件事一直萦绕在我的脑海中,现在我想要答案,我需要做什么才能让我的gameloop睡眠到想要的唤醒点,理论上说,我真的不知道xD点在哪里

为了便于反馈,这是我的gameloop的简化版本:

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);
        }
    }
}

谢谢你的帮助

如果决定每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.sleep10可能在10毫秒内无法睡眠;System.currentTimeMillis可能不会返回粒度小于1ms的结果。这取决于平台

如果决定每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.sleep10可能在10毫秒内无法睡眠;System.currentTimeMillis可能不会返回粒度小于1ms的结果。这取决于平台

如果你还没有读过的话,这里有一篇关于游戏循环的优秀文章


根据我编写J2ME游戏的经验,你会希望尽量减少你在游戏循环中做任何事情的次数,因为写得不好的游戏循环会很快耗尽一点电池。也就是说,如果渲染时间为10毫秒,请确保检查是否有任何更改,如果没有,请跳过它。

如果您还没有阅读过关于游戏循环的精彩文章,请参阅

根据我编写J2ME游戏的经验,你会希望尽量减少你在游戏循环中做任何事情的次数,因为写得不好的游戏循环会很快耗尽一点电池。也就是说,如果渲染时间为10毫秒,请确保检查是否有任何更改,如果没有,请跳过它