[英]Strange behavior of java game loop
我在Java中有一個簡單的游戲循環:
public void run(){
while(running){
start = System.nanoTime();
gamePanel.update();
gamePanel.repaint();
elapsed = System.nanoTime() - start;
wait = (TARGET_TIME - elapsed) / 1000000;
if(wait < 0){wait = TARGET_TIME;}
try {Thread.sleep(wait);}catch(Exception e) {e.printStackTrace();}
}
}
現在的問題是:當我在update()郊游中添加“更新”和在paintComponent()郊游中添加一個“重新繪畫”時,我得到以下結果:
updating
updating
updating
updating
updating
(x1000 and more)
repainting
因此,當我重塗一次時,游戲將更新1000次以上。 正常嗎 我認為它有點奇怪,不是嗎? 例如,可以與玩家進行1000步,直到游戲對其進行繪制...這意味着update()方法不等待重新繪制完成嗎? 為什么?
謝謝!
編輯:這里更新代碼:
public void update(){
if(moveUp){
changeMapY(map, -map.getSpeed());
}
if(moveDown){
changeMapY(map, map.getSpeed());
}
if(moveRight){
changeMapX(map, map.getSpeed());
}
if(moveLeft){
changeMapX(map, -map.getSpeed());
}
}
編輯2:這就是changeMap的作用:(也許這是問題所在?)
public void changeMapX(Map map, int amount){
for(int i = 0; i < blocks.length; i++){
for(int j = 0; j < blocks[0].length; j++){
blocks[i][j].addX(amount);
}
}
map.addOffsetx(amount);
}
public void changeMapY(Map map, int amount){
for(int i = 0; i < blocks.length; i++){
for(int j = 0; j < blocks[0].length; j++){
blocks[i][j].addY(amount);
}
}
map.addOffsety(amount);
}
您以秒為單位計算等待時間。 (納秒/ 100萬)
睡眠參數應以毫秒為單位。 因此更改此行:
wait = (TARGET_TIME - elapsed) / 1000;
我測試了您的源代碼,並且“更新”,“重新繪制”是一個接一個的。 問題與您的update()
方法有關。 也許遞歸,也許循環。
假設gamePanel是Swing組件,您可能會觀察到repaint()實際上沒有調用JComponent.paintComponent()。 它所做的一切本質上是使組件的圖形無效,並告訴Swing在將來的某個時間點在Swing線程上重新繪制組件。
多次調用repaint()不一定會導致多次調用paintComponent()-多余的重新繪制請求被折疊為一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.