我不喜欢发布这类问题。但是这次我真的不知道发生了什么。
我在PC上编写了此代码,并且运行良好。但是在我的Macbook上它不起作用。它陷入第二个循环,看起来像什么?有办法防止这种情况吗? Macbook不够快吗?
代码:
package com.mittspel;
public class Handler implements Runnable {
Thread thread;
boolean running = true;
boolean render = false;
int UPDATE_TIME = 1/60;
Handler() {
thread = new Thread(this);
thread.run();
}
public void run() {
double startTime = System.nanoTime() / Math.pow(10,9);
double endTime = 0;
double passedTime = 0;
double notProcessedTime = 0; //So we dont skip frames.
double frameTime = 0;
int frames = 0;
int fps = 0;
while(running) {
render = false;
endTime = System.nanoTime() / Math.pow(10,9);
passedTime = endTime - startTime;
frameTime += passedTime;
notProcessedTime += passedTime;
System.out.println("First loop");
do {
notProcessedTime -= UPDATE_TIME;
render = true;
frames++;
if(frameTime == 1.0) {
fps = frames;
System.out.println(fps);
frames = 0;
frameTime = 0;
fps = 0;
}
System.out.println("Second Loop");
}
while(notProcessedTime >= UPDATE_TIME);
if(render) {
//TODO: Render stuff
}
}
}
public void start() {
}
public static void main(String[] args) {
Handler handler = new Handler();
handler.start();
}
}
出了什么问题? 上面的代码应该是游戏循环的“开始”。当游戏“运行”时,第一个循环运行,而当“ notProcessedTime”超过1/60时,第二个循环运行。为什么?因为我希望在那里的代码以60fps更新。在while循环中,我还从notProcessedTime中删除了UPDATE_TIME,这简而言之意味着我不希望代码跳过帧。在第二个循环的后面,我要打印fps。如果正常运行,则应为60fps。
发布前我尝试了什么?
我尝试在循环中制作一些“ System.out.println”并删除了代码。它给了我以下结果:
- 删除第二个while循环时,它会在第一个循环中正确循环。真的很明显。
- 在两个循环中都插入“ System.out.println”时(如上面的代码所示),我发现它在第一个循环中只打印一次,然后仅将第二个循环到无限大。
我自己调试后预测,它会卡在第二个while循环中。当代码在PC上运行时,我想知道它是否与硬件有关?我被困住了,我需要帮助。我已经调试了它,没有比这个更好的结论了。
我很难插入上面的代码,对此表示抱歉!