FPS计数故障

时间:2012-07-14 04:53:46

标签: java

我在我的游戏中添加了一个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];
    }

}
我已经查了一下,我找不到什么问题;如果有人可以回复我,这将是惊人的!

2 个答案:

答案 0 :(得分:1)

线程的优先级可能会干扰您的游戏输出管道。也就是说,计数器耗费了大量的运行时间,导致引擎管道无法跟上,这可能就是FPS被报告为0的原因。

你可以尝试降低Thread的优先级(当你创建它时)和/或将Thread.yield放在计算循环中的某个位置。这确实意味着FPS计算会被分流到后面,但会让游戏引擎正常运行(至少比它更快)

答案 1 :(得分:0)

如果有人迷路了,那就错了=)

此行

while (UnproccesedSeconds < SecondsPerTick) {}

需要

while (UnproccesedSeconds > SecondsPerTick) {}