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%时,游戏才会变慢。
待续...
闽公网安备 35060202000074号