gpt4 book ai didi

java - AWT Canvas BufferStrategy 和调整大小闪烁

转载 作者:行者123 更新时间:2023-12-01 12:13:31 31 4
gpt4 key购买 nike

我正在尝试使用 Java2D 制作一个简单的游戏以获得最大的兼容性。它在 Mac OS X Yosemite 上的 Java 8 下工作得很好,但当我在 Windows 7 下尝试相同的代码时,它就不那么流畅了。当调整 JFrame 大小时, Canvas 会闪烁,这真的很难看。

我的应用程序使用带有 BufferStrategy 的 AWT Canvas,并且工作原理如下。当环境中的物体移动时,另一个线程调用重绘。但对于窗口大小调整处理,我的策略如下:

public class TestCanvas
{
private static final Color[] colors = new Color[]{Color.black, Color.darkGray, Color.gray, Color.lightGray, Color.blue.darker().darker(), Color.blue, Color.blue.brighter().brighter(), Color.white};

public static void main(String[] args)
{
JFrame frame = new JFrame("Test Canvas");
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
Canvas canvas = new Canvas()
{
@Override
public void paint(Graphics g)
{
BufferStrategy bufferStrategy = getBufferStrategy();
g = bufferStrategy.getDrawGraphics();
paint100Circles(g);
g.dispose();
bufferStrategy.show();
}

@Override
public void update(Graphics g)
{
paint(g);
}

@Override
public void repaint()
{
paint(null);
}
};
contentPane.add(canvas, BorderLayout.CENTER);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(1000, 1000);
frame.setVisible(true);
canvas.createBufferStrategy(2);
}

public static void paint100Circles(Graphics g)
{
Random random = new Random(0);
for (int i = 0; i < 100; i++)
{
int x = Math.abs(random.nextInt()) % 1000;
int y = Math.abs(random.nextInt()) % 1000 + (Math.abs(random.nextInt() % 1000) / 25);
int size = 50 + Math.abs(random.nextInt()) % 50;
g.setColor(colors[Math.abs(random.nextInt()) % colors.length]);
g.fillOval(x, y, size, size);
}
}
}

也许我没有以正确的方式使用 BufferStrategy?

最佳答案

我使用createBufferStrategy(3),但2也应该可以。

this answer基本上鼓励您使用paintComponent,而不是paint()。引用:

“这里的问题是,paint 做了许多重要的工作,调用paintComponent 只是其中之一。”

您可能想尝试切换到paintComponent。你所做的其他事情看起来都很好。

不过话虽如此,在我自己的代码中我根本不调用paint()或paintComponent()。相反,我会尽可能地写入 bufferStrategy(render() 循环尽可能多地运行)

我认为当您使用 bufferStrategy 时,您会在 Paint() 之外写入缓冲区,并且在绘制期间只需将缓冲区写入屏幕。就像 this answer 中所说的那样,虽然它没有获得任何分数,但它可能仍然有有效的提示。

所以我认为要么使用paintComponent并在那里进行绘画(我认为您仍然可以设置双缓冲策略,但绘制到您的图形)或写入paintComponent/paint外部的缓冲区并让组件绘制缓冲区当它需要的时候。

关于java - AWT Canvas BufferStrategy 和调整大小闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27136250/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com