gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:31:20 28 4
gpt4 key购买 nike

我有下面的代码(移植到 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com