服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使用midp2.0开发游戏(7)设计scheduler


  scheduler负责以固定的频率执行每一帧,所需的时钟由clock提供,scheduler还可以计算每帧所需时间和cpu占用率,以便可能的话动态调整任务。

以下的scheduler的实现参考自marshall "game programming gems 3"中的c++代码:

package game.engine.core;

public class scheduler {

    // clock:
    private clock clock = new clock();
    
    // 启动scheduler:
    public void start() {
        clock.start();
    }

    // 停止scheduler:
    public void stop() {
        clock.stop();
    }

    public int getsystemtime() {
        return clock.getsystemtime();
    }

    public int getvirtualtime() {
        return clock.getvirtualtime();
    }

    // 执行完整的一帧:
    public void executeframe() {
        system.out.println("-- start execute frame --");
        clock.beginframe();
        int started = clock.getsystemtime();
        // do time task:
        system.out.println("doing time tasks...");
        try {
            thread.sleep(500);
        }catch(interruptedexception ie) {}
        clock.advancetoend();
        // do frame task:
        system.out.println("doing frame tasks...");
        try {
            thread.sleep(200);
        }catch(interruptedexception ie) {}
        // do render task:
        int end = clock.getsystemtime();
        int elapsed = end - started;
        int framelength = clock.getframeend() - clock.getframestart();
        system.out.println("elapsed: " + elapsed + ", frame: " + framelength);
        system.out.println("cpu usage: " + (elapsed * 100 / framelength) + "%");
        // cleanup:
        system.out.println("-- end execute frame --/n");
    }

    public void waituntil(int time) {
        try {
            while(clock.getsystemtime()                thread.sleep(1);
            }
        }catch(interruptedexception ie) {}
    }

    public static void main(string[] args) {
        scheduler scheduler = new scheduler();
        scheduler.start();
        int time = 1000;
        do {
            scheduler.waituntil(time);
            time += 1000;
            scheduler.executeframe();
        } while(scheduler.getsystemtime()<10000);
    }

}

我们还没有真正的任务要执行,所以只好用两个thread.sleep()来表示执行任务,分别是500ms和200ms,在main()方法中每1s执行一次executeframe()方法,可以看到如下输出:

-- start execute frame --
[beginframe] virtual time = 0, systemtime = 1002
doing time tasks...
[advancetoend] virtual time = 992
doing frame tasks...
elapsed: 701, frame: 992
cpu usage: 70%
-- end execute frame --

-- start execute frame --
[beginframe] virtual time = 992, systemtime = 2003
doing time tasks...
[advancetoend] virtual time = 1993
doing frame tasks...
elapsed: 701, frame: 1001
cpu usage: 70%
-- end execute frame --
...

cpu使用率是70%,如果把任务时间延长大于1s,比如700ms和500ms,虚拟时间就变慢,因为cpu不能在1s内处理完任务,输出的cpu使用率100%(除了第一次计算):

-- start execute frame --
[beginframe] virtual time = 0, systemtime = 1002
doing time tasks...
[advancetoend] virtual time = 992
doing frame tasks...
elapsed: 1201, frame: 992
cpu usage: 121%
-- end execute frame --

-- start execute frame --
[beginframe] virtual time = 992, systemtime = 2203
doing time tasks...
[advancetoend] virtual time = 2193
doing frame tasks...
elapsed: 1202, frame: 1201
cpu usage: 100%
-- end execute frame --

-- start execute frame --
[beginframe] virtual time = 2193, systemtime = 3415
doing time tasks...
[advancetoend] virtual time = 3405
doing frame tasks...
elapsed: 1202, frame: 1212
cpu usage: 99%
-- end execute frame --
...

有一些微小的误差,因为调度器自身的代码也会占用一点时间,并且currenttimemillies()只能精确到毫秒级,不过用户是感觉不出来的,只有当cpu使用达100%时,游戏才会变慢。

待续...

扫描关注微信公众号