我正在开发一款java游戏。经过一些常规的毫秒后,我正在重新粉刷屏幕。 但是如果定时器持续时间变得非常小,那么屏幕开始闪烁。
有什么办法可以避免吗?
我们可以使用多线程来避免这种情况吗?
答案 0 :(得分:2)
查看this tutorial,其中介绍了如何使用加速图形模式和双缓冲来避免屏幕闪烁。关键概念是创建BufferStrategy
来管理双缓冲:
// create the buffering strategy which will allow AWT
// to manage our accelerated graphics
createBufferStrategy(2);
strategy = getBufferStrategy();
然后,在渲染过程中,您从缓冲区策略中获取Graphics对象,使用Graphics
执行渲染,然后调用strategy.show()
。
// Get hold of a graphics context for the accelerated
// surface and blank it out
Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
g.setColor(Color.black);
g.fillRect(0,0,800,600);
g.dispose();
strategy.show();
答案 1 :(得分:1)
答案 2 :(得分:1)
当您重新绘制时,您将在重绘之前清除整个画布,这显示为闪烁。如果您可以通过将相同的形状与背景颜色叠加来仅清除画布的先前绘制部分,则可以避免闪烁。这只是一种可能的解决方案。
答案 3 :(得分:1)
可用于减少动画中的屏幕闪烁的技术是使用double buffering。通过具有执行绘图操作的离屏目的地来实现双缓冲,并且仅当准备好显示离屏绘图时才将其绘制到物理屏幕。
多线程不是解决方案,因为GUI由AWT和Swing中的单个线程管理。
答案 4 :(得分:-1)
确保您正在使用EDT。 javax.swing.Timer
的实例使这很容易,因为动作事件处理程序在EDT上执行。即使在高帧速率下,我也看不到默认缓冲策略的闪烁,如here所示。