私は物理学に重点を置いたゲームを構築しています。したがって、非常に特定の間隔でゲームを実行する必要があります。現在のコード:
public double period = .02; //this is the run interval in seconds
//main gameLoop
public void gameLoop(){
long startTime;
long sleep;
while(running){
startTime = System.nanoTime();
Graphics2D g = s.getGraphics();
operateEntities(g);
g.dispose();
s.update();
//figure out how long it must sleep to take .02s altogether
sleep = ((int)(period*1000) - (System.nanoTime() - startTime)*100000);
try{
if(sleep > 0){
Thread.sleep(sleep);
}else{
System.err.println("Warning: program runtime exceeded period");
}
}catch(Exception ex){}
gameTime += period;
}
}
これは期待どおりに機能していません。現在、メインスレッドはまったくスリープせずに実行されており、「警告:プログラムの実行時間が超過しました」という警告が表示されます。
以前はSystem.currentTimeMillis()を使用していましたが、目的に対して十分に正確ではなかったため、System.nanoTime()に切り替えました。
期間を長くすると、実際にはプログラムの速度が上がり、短くすると遅くなります。
単純な論理的な問題はありますか?System.nanoTime()についての私の理解はオフですか?または、メソッドoperateEntitiesを実行し、特定の間隔で破棄し、更新するためのより良い方法はありますか?
編集:記録のために、プログラムは完了するのに.02秒以上かかりません。テスト済みです