java - 为什么当我要求 30 FPS 时,这段代码有时会报告 21.3 FPS?

标签 java opengl 3d jogl frame-rate

我有下面的代码(移植到 JOGL 2.0 的 Nehe 教程 1 的基本版本)请求一个以 30 FPS 为动画的 FPSAnimator。当我运行代码时,它会打印 21.321962 或 21.413277 FPS。在创建 FPSAnimator 时,如您所见,我指定需要每秒 30 帧。这是在配备 Core i7 CPU、24GB RAM 和 ATI Radeon HD 5700 系列显卡的现代机器上进行的。 21.3 FPS 似乎也不是限制。当我提高或降低请求的 FPS 时,报告的 FPS 会上下波动(尽管它似乎不是线性关系)。

但是,有时当我在同一台机器上运行代码时,会得到 30.30303 FPS。在这两种情况下,我都只有几个 Web 浏览器选项卡和机器上打开的 eclipse。还值得注意的是,这不仅发生在这个简单的示例中,它发生在我所有基于 JOGL 的应用程序中。我只是提供了这个简单的例子来说明这个问题。

我在几台机器上看到过这个问题。也许这只是我的想象,但它似乎不会发生在带有 NVidia GeForce 卡的机器上,但我已经看到它发生在带有 ATI 卡和 NVidia Quadro FX 卡的机器上。

是什么导致了这种差异?

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();
}

最佳答案

问题可能是由与 java.util.Timer.schedule() 相关的不准确引起的,JOGL 在用任何双参数构造函数初始化时使用它,或者当第 3 个参数时,它是使用固定速率调度的标志,设置为false


当标志设置为 true 时,FPSAnimator 将改用 java.util.Timer.scheduleAtFixedRate(),从而在 FPS 方面更加一致和准确。

具体来说,使用标志为 true 在更高的 FPS 中会特别好,因为默认值对延迟很弱并且会开始出现漂移,同时使用 固定速率调度将在很长一段时间内执行正确次数的动画,无论延迟如何 [source] .


但是请注意,根据对 ticket responsible for this functionality being implemented 的回复,不清楚该标志是否会导致过多的 CPU 消耗。

关于java - 为什么当我要求 30 FPS 时,这段代码有时会报告 21.3 FPS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12936690/

相关文章:

xcode - SDL2.0 与 XCode 4.6

c++ - 使用客户端顶点数组在没有 VBO 的情况下在 opengl 3.1+ 中呈现

algorithm - 自动试穿衣服的算法?

javascript - THREE.js:将网格划分为多个部分

java - java swing 中的全局加速器

Java MySQL虚拟主机推荐

java - java中n*4表的数据结构

c++ - 使用 opengl c++ 的天空盒问题

r - 如何处理R透视图的暗区

java - 如何从 Netbeans 中的 Java 应用程序项目中排除源文件?