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口吃。