2

30 FPSをアニメーション化するFPSAnimatorを要求する以下のコード(JOGL 2.0に移植されたNeheチュートリアル1の最低限のバージョン)があります。コードを実行すると、21.321962または21.413277FPSが出力されます。ご覧のとおり、FPSAnimatorを作成するときは、1秒あたり30フレームが望ましいと指定します。これは、Core i7 CPU、24GBのRAM、およびATI RadeonHD5700シリーズグラフィックスカードを搭載した最新のマシン上にあります。21.3FPSも制限ではないようです。要求されたFPSを上げたり下げたりすると、報告されたFPSは上下します(線形関係ではないようですが)。

ただし、同じマシンでコードを実行すると、30.30303FPSが得られる場合があります。どちらの場合も、マシン上で開いているWebブラウザのタブと日食は数個しかありません。これは、この単純な例だけでなく、私のJOGLベースのすべてのアプリケーションでも発生することにも注意してください。この問題を示すために、この簡単な例を提供しただけです。

この問題は、いくつかのマシンで見られました。たぶんそれは私の想像ですが、NVidia GeForceカードを搭載したマシンでは発生しないようですが、ATIカードとNVidiaQuadroFXカードを搭載したマシンで発生するのを見てきました。

この違いの原因は何でしょうか?

public static void main(String[] args) {
    GLCanvas glCanvas;
    FPSAnimator animator;
    JFrame frame = new JFrame("JOGL HelloWorld");
    GLCapabilities caps = new GLCapabilities(null);

    caps.setDoubleBuffered(true);
    caps.setHardwareAccelerated(true);
    glCanvas = new GLCanvas(caps);
    glCanvas.setSize(800, 800);
    glCanvas.setIgnoreRepaint(true);
    glCanvas.addGLEventListener(new GLEventListener() {
        @Override
        public void reshape(GLAutoDrawable gLDrawable, int x, int y,
                int width, int height) {
        }

        @Override
        public void init(GLAutoDrawable gLDrawable) {
        }

        @Override
        public void dispose(GLAutoDrawable gLDrawable) {

        }

        @Override
        public void display(GLAutoDrawable gLDrawable) {
            FPSAnimator animator = (FPSAnimator) gLDrawable.getAnimator();
            System.out.println("animator.getLastFPS(): "
                    + animator.getLastFPS());
        }
    });

    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(glCanvas, BorderLayout.CENTER);

    animator = new FPSAnimator(glCanvas, 30, false);
    frame.setSize(frame.getContentPane().getPreferredSize());
    frame.setVisible(true);
    animator.setUpdateFPSFrames(10, null);
    animator.start();
}
4

2 に答える 2

2

この問題は、 に関連する不正確さが原因である可能性がjava.util.Timer.schedule()あります。JOGL は、任意の 2 パラメータ コンストラクタで初期化するとき、または固定レート スケジューリングを使用するためのフラグである 3 番目のパラメータが に設定されているときに使用しfalseます。


フラグが に設定されている場合true、FPSAnimator はjava.util.Timer.scheduleAtFixedRate()代わりに を使用し、FPS に関して一貫性と精度が大幅に向上します。

true具体的には、デフォルトは遅延に弱く、ドリフトが発生し始めるため、より高い FPS でフラグを使用すると特に効果的です。遅延に関係なく [source] .


ただし、この機能の実装に関与するチケットへの応答によると、フラグが過度の CPU 消費を引き起こすかどうかは不明であることに注意してください。

于 2012-10-18T18:59:36.847 に答える
0

要求された 30 fps は保証されません。ほとんどの場合、FPS は上下しますが、平均 fps は要求どおりになろうとします。

VSync は gl.setSwapInterval(1) で有効にできます。Windows の設定とは関係ありません。

animator.setUpdateFPSFrames(200, System.out); を使用します。200 フレームごとに平均 fps を出力するには

于 2012-10-18T16:19:01.227 に答える