【发布时间】:2012-02-22 06:06:48
【问题描述】:
我正在用 Java 制作一个概念验证游戏,并决定(为了练习,但主要是为了好玩)用线程安全的双缓冲制作我自己的简单组件。但是,在并发方面(特别是关于 Swing)我不是很有经验,我想知道我的实现是否有任何我遗漏的问题。
实现如下:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class GamePanel extends JPanel
{
private static final long serialVersionUID = 1L;
private BufferedImage mBackImage = null;
private BufferedImage mFrontImage = null;
public BufferedImage getBackImage ()
{
return mBackImage;
}
public void swap ()
{
BufferedImage new_back;
//
synchronized (this)
{
new_back = mFrontImage;
mFrontImage = mBackImage;
}
//
int width = getWidth (), height = getHeight ();
if (width > 0 && height > 0)
{
if (new_back == null || new_back.getWidth () != width
|| new_back.getHeight () != height)
new_back = new BufferedImage (width, height,
BufferedImage.TYPE_INT_ARGB);
//
mBackImage = new_back;
}
else
mBackImage = null;
}
@Override
public void paintComponent (Graphics g)
{
synchronized (this)
{
if (mFrontImage == null)
super.paintComponent (g);
else
g.drawImage (mFrontImage, 0, 0, null);
}
}
}
我假设getBackImage() 和swap() 只会被单个线程(游戏循环线程)调用。油漆通过 Swing 计时器触发,在 EDT 中也是如此。我相信围绕mFrontImage 的使用的简单同步块应该足以防止不必要的行为,允许游戏循环线程渲染到背面图像并调用交换,而不必担心 Swing 重绘。我错过了什么吗?
【问题讨论】:
标签: java swing thread-safety