Java 与视网膜显示器一起使用的缓冲策略

Java 与视网膜显示器一起使用的缓冲策略,java,graphics,retina-display,graphics2d,bufferstrategy,Java,Graphics,Retina Display,Graphics2d,Bufferstrategy,让我从这个小示例应用程序开始: public class Main extends Canvas{ public static void main(String[] args) { new Main(); } private BufferStrategy buffstrat; public Main() { JFrame frame = new JFrame(); frame.add(this);

让我从这个小示例应用程序开始:

public class Main extends Canvas{
    public static void main(String[] args) {
        new Main();
    }

    private BufferStrategy buffstrat;

    public Main() {
        JFrame frame = new JFrame();
        frame.add(this);
        this.setPreferredSize(new Dimension(800, 600));
        frame.setVisible(true);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        createBufferStrategy(2);
        buffstrat = getBufferStrategy();

        while(true) {
            paint();
        }
    }

    public void paint() {
        Graphics g = buffstrat.getDrawGraphics();
        g.setColor(Color.black);
        Image image = createImage(100, 100);
        Graphics g2 = image.getGraphics();
        g2.setColor(Color.white);
        g2.fillRect(0, 0, 100, 100);
        g2.setColor(Color.black);
        g2.drawOval(10, 10, 80, 80);
        g.drawImage(image, 0, 0, null);
        buffstrat.show();
    }
}
我的目的是让这个应用程序以视网膜分辨率绘制一个圆圈,但我发现,
buffstrat
中的缓冲区宽度与非视网膜分辨率相同。为了解释这一点,我创建了一个单独的图像来绘制圆圈,然后将其缩小。然而,这似乎也行不通


我在这里不知所措,因为我想使用
BufferStrategy
或类似的方法。现在,我正在使用我自己的形式的可变超大缓冲区,它可以使用
repaint()
重新调用。这已经被证明偶尔会出现vsync错误,所以我想切换到缓冲区策略,但如果我在使用时失去视网膜的支持,就不会这样。任何关于如何同时完成正确的vsync和retina显示的想法都将不胜感激

我认为您需要将两者结合起来,
BufferStrategy
将是可视输出区域的大小(
Canvas
),对此您几乎无能为力。不过,渲染区域应该是可视区域的两倍(如果不是更多的话)(从内存中,4x通常用于“伪造”抗锯齿)。然后将图像缩小到
BufferStrategy
并将其绘制到
BufferStrategy
。您可能需要实现自己的页面翻转算法,这样当页面被渲染到
缓冲策略时,您就不会渲染到“页面”。但问题是,我仍然无法以清晰的视网膜分辨率看到图像。如果最终无法同时实现这两个目标,我会选择我现在拥有的,这里和那里的一些vsync口吃。