Java VSync без полноэкранного окна - PullRequest
0 голосов
/ 23 октября 2019

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