我在我的游戏中添加了一个fps计数器,它在我尝试添加它之前工作正常,但现在它是一个白色的盒子,在控制台中它以惊人的速度打印0 fps:
private void start() {
if (running) {
return;
}
running = true;
thread = new Thread(this);
thread.start();
System.out.println("Error Free!");
}
public void stop() {
if (!running) {
return;
}
running = false;
try {
thread.join();
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
public void run() {
int frames = 0;
double UnproccesedSeconds = 0;
long PreviousTime = System.nanoTime();
double SecondsPerTick = 1 / 60.0;
int TickCount = 0;
boolean Ticked = false;
while (running) {
long CurrentTime = System.nanoTime();
long PassedTime = CurrentTime - PreviousTime;
PreviousTime = CurrentTime;
UnproccesedSeconds += PassedTime / 1000000000.0;
while (UnproccesedSeconds < SecondsPerTick) {
tick();
UnproccesedSeconds -= SecondsPerTick;
Ticked = true;
TickCount++;
if (TickCount % 60 == 0) {
System.out.println(frames + "fps");
PreviousTime += 1000;
frames = 0;
}
}
if (Ticked) {
render();
frames++;
}
render();
frames++;
}
}
private void tick() {
}
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
Screen.render();
for (int i = 0; i < WIDTH * LENGTH; i++) {
PIXELS[i] = Screen.PIXELS[i];
}
}
我已经查了一下,我找不到什么问题;如果有人可以回复我,这将是惊人的!
答案 0 :(得分:1)
线程的优先级可能会干扰您的游戏输出管道。也就是说,计数器耗费了大量的运行时间,导致引擎管道无法跟上,这可能就是FPS被报告为0的原因。
你可以尝试降低Thread的优先级(当你创建它时)和/或将Thread.yield放在计算循环中的某个位置。这确实意味着FPS计算会被分流到后面,但会让游戏引擎正常运行(至少比它更快)
答案 1 :(得分:0)
如果有人迷路了,那就错了=)
此行
while (UnproccesedSeconds < SecondsPerTick) {}
需要
while (UnproccesedSeconds > SecondsPerTick) {}