我正试图让我的游戏保持在60fps,但是我的代码变得奇怪,比如“2-8000 fps”为什么这不是60?
public void run(boolean fullscreen) {
this.fullscreen = fullscreen;
try {
long lastFrame = 0;
long frames = 0;
init();
while (!done) {
frames++;
long startTime = System.nanoTime() / 1000000;
try
{
System.out.println("framerate: " + ((System.nanoTime() / 1000000 - startTime) / frames ) );
// 123456: 6 zeros => 16ms
long nsToSleep = 17000000 - (System.nanoTime() - lastFrame);
System.out.println("ns: " + nsToSleep);
lastFrame = System.nanoTime();
if(nsToSleep > 0)
{
System.out.println("ns2: " + (nsToSleep/1000));
System.out.println("ns3: " + (nsToSleep%1000));
Thread.sleep(nsToSleep/17000000, (int)(nsToSleep % 1000));
}
else
{
Thread.yield(); // Only necessary if you want to guarantee that
// the thread yields the CPU between every frame
}
}
catch(Exception e){
e.printStackTrace();
}
mainloop();
render();
Display.update();
}
cleanup();
}
catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
答案 0 :(得分:1)
Thread.sleep(nsToSleep/17000000, ...);
应该是
Thread.sleep(nsToSleep/1000000, nsToSleep%1000000);
当你将纳秒转换为毫秒时。
另外,正如diciu在你的问题评论中指出的那样,你应该把计算结果移到循环之外。
我没有测试过这个,所以我不确定你是否需要修复它,但是快速浏览一下你的代码似乎就会显示出这些问题。