如何在JOGL中获取应用整体FPS?内置Animator接口返回0问题求助
JOGL应用FPS获取解决方案
问题原因
你当前获取FPS返回0且无日志输出的核心原因是:仅实例化了Animator对象,但没有调用其start()方法启动动画循环,FPS统计逻辑未实际运行。同时如果你的项目是手动触发display渲染而非依赖Animator自动调度,内置的FPS统计机制也不会生效。
方案1:使用JOGL内置接口修复
如果你愿意使用Animator调度渲染,修改初始化逻辑即可正常获取内置统计的FPS,这个帧率和你全局应用的渲染帧率完全一致,只要所有渲染逻辑都走当前GLAutoDrawable的display回调:
@Override public void init(GLAutoDrawable glAutoDrawable) { // 构造时直接绑定drawable,写法更规范 Animator animator = new Animator(glAutoDrawable); // 配置FPS更新规则:每3帧更新一次统计,输出到控制台 animator.setUpdateFPSFrames(3, System.out); glAutoDrawable.setAnimator(animator); // 必须调用start启动,统计逻辑才会运行 animator.start(); } @Override public void dispose(GLAutoDrawable glAutoDrawable) { // 页面销毁时停止Animator,避免内存泄漏 glAutoDrawable.getAnimator().stop(); }
注意:启动后前3帧统计未完成会返回0,后续即可拿到正确FPS数值。
方案2:自行实现FPS计数器(更轻量)
如果你原本项目不需要Animator的自动渲染调度,自行实现FPS计数器逻辑更简单,无额外依赖,完全适配你的自定义渲染逻辑:
public class GameCanvas implements GLEventListener{ // FPS统计专用变量 private long lastFpsCalcTime = System.currentTimeMillis(); private int frameCounter = 0; private float currentFps = 0f; @Override public void display(GLAutoDrawable glAutoDrawable) { GL2 glDraw = glAutoDrawable.getGL().getGL2(); gameTestMethods.onRender(glDraw); // 插入FPS统计逻辑 frameCounter++; long currentTime = System.currentTimeMillis(); // 每1秒计算一次FPS if (currentTime - lastFpsCalcTime >= 1000) { currentFps = frameCounter * 1000f / (currentTime - lastFpsCalcTime); Log.log(Log.LogLevel.DEBUG, "FPS: " + currentFps); // 重置计数器和时间戳 frameCounter = 0; lastFpsCalcTime = currentTime; } } // 其余原有逻辑保持不变 }
总结
- 可通过修复
Animator启动逻辑使用JOGL内置接口获取正确FPS - 不需要
Animator的场景下,自行实现FPS计数器更轻量可控,适配性更强
内容的提问来源于stack exchange,提问作者CodingM
相关产品推荐
相关产品推荐

