让我从这个小示例应用程序开始:
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 错误,所以我想切换到缓冲区策略,但如果我在使用它时失去了视网膜支持,则不会。任何关于我如何同时完成正确的垂直同步和视网膜显示的想法将不胜感激!