【发布时间】:2020-07-25 03:27:01
【问题描述】:
我正在尝试使我的窗口应用程序与显示器刷新进行垂直同步。此代码适用于“fullscreen = true”(报告 75FPS,显示器刷新率),但在窗口模式下它仅报告 32FPS。有人知道我在这里做错了什么吗?
import java.awt.BufferCapabilities;
import java.awt.GraphicsEnvironment;
import java.awt.ImageCapabilities;
import java.awt.image.BufferStrategy;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import sun.java2d.pipe.hw.ExtendedBufferCapabilities;
public class VSyncTest {
public static void main(String args[]) {
final boolean fullscreen = true;
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame v = new JFrame();
if (fullscreen) {
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(v);
v.createBufferStrategy(2);
} else {
v.setVisible(true);
ExtendedBufferCapabilities b = new ExtendedBufferCapabilities(new BufferCapabilities(new ImageCapabilities(true), new ImageCapabilities(true), BufferCapabilities.FlipContents.PRIOR), ExtendedBufferCapabilities.VSyncType.VSYNC_ON);
try {
v.createBufferStrategy(2, b);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
new Thread() {
@Override
public void run() {
BufferStrategy bs = v.getBufferStrategy();
long start = System.nanoTime(), frames = 0;
do {
bs.getDrawGraphics();
bs.show();
frames++;
long elapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
long framesPerS = (long) (frames / (elapsed / 1000D));
if (frames % 60 == 0) {
System.out.println("Frames/s: " + framesPerS + ", Elapsed: " + elapsed / 1000);
}
} while (true);
}
}.start();
}
});
}
}
【问题讨论】:
标签: java swing jframe fullscreen vsync