开启NVIDIA G-SYNC时JavaFX窗口卡顿帧率低问题求解
运行环境与问题现象
- 运行环境:Windows 10 系统、GTX 980Ti 显卡、JDK 18 版本
- 问题表现:开发的无动画简单JavaFX UI,在开启窗口化应用NVIDIA G-SYNC功能、且JavaFX窗口处于聚焦状态时,整个显示器范围内的鼠标移动都会出现卡顿,经FRAPS检测,该场景下窗口帧率仅约2fps
- 临时触发的缓解效果:手动触发窗口重绘时卡顿会暂时消失,比如选中文本、调整窗口大小的操作过程中,窗口帧率会提升至显示器原生刷新率(120fps),鼠标移动恢复流畅
已测试的临时规避方案
1. AnimationTimer强制触发重绘
通过AnimationTimer在窗口聚焦时持续触发组件重绘,可以让窗口稳定跑满120fps,但会带来额外的CPU开销,实现代码如下:
private boolean focus = false; public void setStageAndSetupListeners(Stage stage) { stage.focusedProperty().addListener((ov, onHidden, onShown) -> focus = ov.getValue()); AnimationTimer timer = new AnimationTimer() { @Override public void handle(long now) { if (focus) { label.setVisible(false); label.setVisible(true); } } }; timer.start(); }
2. 启用软件渲染
添加JVM启动参数-Dprism.order=sw强制使用软件渲染管线,该方案存在明显缺陷:运行时会出现字体显示错乱的问题。
3. 强制启用上传渲染器
添加JVM启动参数-Dprism.forceUploadingPainter=true,实际使用时表现正常无异常,但官方明确标注该参数仅用于测试场景,不推荐在生产环境使用。
核心诉求
- 最优方案:让JavaFX应用和普通桌面应用表现一致,既不产生额外的不必要CPU消耗,也不会触发G-SYNC下的卡顿问题
- 次优方案:实现G-SYNC开启状态的检测逻辑,能够按需启用上述临时规避方案,尽量降低额外开销
其他说明
该问题已经提交至OpenJDK缺陷追踪系统,对应缺陷编号为JDK-8289505。
内容的提问来源于stack exchange,提问作者Meo
相关产品推荐
相关产品推荐

