所以我在java中制作游戏,我有一个问题。计时器使用了大量的cpu资源(大约30%),它可能不应该。当我尝试将渲染放入计时器时,一切正常。有时候,没有改变任何东西它可以正常工作
public static synchronized void run(){
long last = System.nanoTime();
double npt = Time.nano / tps; //one second / ticks
double delta = 0;
//long now;
long pfmLast = System.currentTimeMillis();
long pfmSpm = Time.nano * spu;
long pfmDelta = 0;
int pfmUpdates = 0;
long pfmNow;
long fpsLast = System.nanoTime();
double npf = Time.nano / fps; //one second / ticks
double fpsDelta = 0;
//long fpsNow;
int frames = 0;
Handler.init();
try {
en = new Entity(ImageIO.read(new File("res/robot.png")), 1, 1, false);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while(running){
long now = System.nanoTime();
delta += (now - last)/npt;
last = now;
while(delta >= 1){
pfmUpdates++;
Handler.update();
delta -= 1;
}
long fpsNow = System.nanoTime();
fpsDelta += (fpsNow - fpsLast)/npf;
fpsLast = fpsNow;
while(fpsDelta >= 1){
frames++;
render();
Handler.render();
fpsDelta -= 1;
}
if(loggingPerformance){
pfmNow = System.currentTimeMillis();
pfmDelta += pfmNow-pfmLast;
pfmLast = pfmNow;
if(pfmDelta >= 1000){
System.out.println(pfmUpdates + ", " + frames);
frames = 0;
pfmUpdates = 0;
pfmDelta=0;
}
}
try {
Thread.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*fpsNow = System.currentTimeMillis();
fpsDelta += fpsNow - fpsLast;
fpsLast = fpsNow;
if(fpsDelta >= npf){
//Handler.render();
frames++;
fpsDelta -= npf;
}*/
}
}
答案 0 :(得分:0)
我认为问题在于你有几个while循环,这些循环基本上是在delta
中计算每个纳秒的游戏状态。
这会给您的计算机带来巨大压力。
你要做的是做Handler.render()
delta
函数所做的任何计算,这样你只需计算一次,而不是每{2}次计算一次! / p>
所以我在想这个
1.000.000.000
应该是这样的:
while(delta >= 1){
pfmUpdates++;
Handler.update();
delta -= 1;
}