1

我已经完成了一系列关于 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);
        }
    }
}

谢谢你的帮助!!

4

2 回答 2

3

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

根据我编写 J2ME 游戏的经验,您会希望尽量减少在游戏循环中执行任何操作的次数,因为编写不佳的游戏循环会很快耗尽手机微不足道的电池电量。也就是说,如果您每 10 毫秒渲染一次,请务必检查是否有任何更改,如果没有,请跳过它。

于 2009-06-18T03:57:02.533 回答
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 毫秒的结果)。这取决于平台。

于 2009-06-18T03:49:28.490 回答