Я пытаюсь заставить мое оконное приложение VSync обновлять монитор. Этот код корректно работает с «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();
}
});
}
}