让我先从这个小例子应用程序开始:
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和视网膜显示的任何想法都将非常感激!