0

ゲームにfpsカウンターを追加していましたが、追加する前は正常に機能していましたが、現在はホワイトボックスになっており、コンソールでは驚くべき速度で0fpsを出力します。

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];
    }

}

私はそれを調べましたが、何が悪いのかわかりません。誰かが私に戻ってくることができれば、それは素晴らしいことです!

4

2 に答える 2

1

スレッドの優先順位は、ゲームの出力パイプラインに干渉している可能性があります。つまり、カウンターが実行時間の多くを消費しているため、エンジンパイプラインが追いつかなくなります。これが、FPSが0として報告される理由である可能性があります。

スレッドの優先度を下げて(作成するとき)、計算ループのどこかにThread.yieldを配置することができます。これは、FPS計算が後方にシャントされることを意味しますが、ゲームエンジンを適切に実行できるようにします(少なくとも以前よりも高速に)

于 2012-07-14T05:49:23.407 に答える
0

ここで誰かが迷子になった場合は何が悪かった=)

この行

while (UnproccesedSeconds < SecondsPerTick) {}

する必要があります

while (UnproccesedSeconds > SecondsPerTick) {}
于 2012-10-07T21:38:50.563 に答える