我在这里有一个游戏循环,它调用了tick方法。在tick方法中,调用其他tick方法。如何在不降低整个程序速度的情况下减慢对input.tick()的调用?在tick方法中放置Thread.sleep();
会减慢整个程序的速度,这不是我想要的。
public void run() {
long lastTime = System.nanoTime();
long timer = System.currentTimeMillis();
final double ns = 1000000000.0 / 60.0;
double delta = 0;
int frames = 0;
int ticks = 0;
while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while(delta >= 1){
tick();
ticks++;
delta--;
}
render();
frames++;
if(System.currentTimeMillis() - timer > 1000){
timer += 1000;
System.out.println(ticks + " tps, " + frames + " fps");
ticks = 0;
frames = 0;
}
}
stop();
}
public void tick(){
input.tick(); // How do I slow down the call to this?
if(gameState){
player.tick();
player.move();
collision();
treeline.move();
obstacleHole.move();
obstacleWolf.move();
coin.move();
coin.tick();
}
}
答案 0 :(得分:2)
您似乎正在执行GUI应用程序,并且您显示的代码在Event Dispatch Thread上运行。 sleep
使EDT冻结,无法更新GUI。你必须做的是使用javax.swing.Timer
类推迟执行代码。
如果您希望定期tick
,则只需在提交给Timer
的处理程序中重新安排同一任务。
答案 1 :(得分:1)
使用线程以延迟方式调用tick()
,如下所示:
private static final Timer TIMER = new Timer();
// ...
public void tick(){
TIMER.schedule(new TimerTask(){
void run() {
input.tick(); // Your tick method
}
}, 1000 /* delay in milliseconds */)
// ... rest of your method
}
答案 2 :(得分:1)
如果input.tick()方法收集播放器的输入(例如按键),则延迟它似乎不合适。
也许您可能对实现键盘输入轮询机制感兴趣。 (有关示例,请参阅here)。
这是游戏中的常用技术,因此您不会像通常的方式那样响应播放器的输入。相反,您收集所有用户输入,例如在队列中,然后您轮询该队列以您自己的速度读取输入(例如每秒30次)。
我希望它有所帮助