我可以从谷歌搜索中看到这个问题被问到很多,但我发现没有一个解决方案是为我做的。你知道,我用Java制作一个带有图像的游戏,因为游戏通常都有这些东西。但整个表格不断闪烁,我无法阻止它。是的,我已经双重缓冲它并覆盖了update()方法,虽然这肯定有帮助,但闪烁仍然存在。我不知道我是否在做双重缓冲,或者我需要完全不同的东西。
起初我觉得它可能与clearRect()行有关,但在删除它之后,游戏仍然闪烁,但当然每次都没有清除。所以这根本没有帮助。在减慢定时器时,闪烁几乎完全消失,但我需要将其减慢到100ms,即便如此,我仍然会有一些闪烁。此外,这对游戏来说太慢了。我试过让一个计时器在一个10ms的计时器上完成所有工作,一个单独的计时器在100ms进行绘画,但它看起来只是看起来很蠢。虽然闪烁仍然是一个问题,但我可以将绘画计时器减慢到大约30毫秒并使其保持平滑。
每10-30毫秒必须有一种方法可以做到这一点而不会闪烁。是否有其他方法类似于双缓冲但在这种情况下更好,或者我可以使用的东西?提前感谢您的帮助。
public class main extends JApplet implements ActionListener {
//This Declares The Variables
Graphics2D buffer;
Image offscreen;
Timer timGame = new Timer(10, this);
//other variables
public void init(){
//This Creates The Offscreen Buffer Zone
offscreen = createImage(getSize().width, getSize().height);
buffer = (Graphics2D)offscreen.getGraphics();
//other initialization stuff irrelevant to drawing
}
public void actionPerformed(ActionEvent evt){
if (evt.getSource() == timGame)
runGame();
}
private void runGame(){
//Do stuff, move objects
repaint();
}
public void paint(Graphics g){
super.paint(g);
buffer.clearRect(0, 0, getSize().width, getSize().height);
//draw stuff to buffer
g.drawImage(offscreen, 0, 0, this);
}
public void update(Graphics gr){
paint(gr);
}
答案 0 :(得分:9)
不要直接绘制顶级窗口的paint(...)
方法,例如JApplet或JFrame,因为你失去了所有双缓冲和所有Swing好东西。而是绘制您添加到JApplet的JPanel或其他JComponent派生组件(包括JComponent本身)的paintComponent(...)
方法。
如果您在此处或Google中搜索此主题,您会看到在此网站和其他网站上多次询问和回答,答案是相同的。
e.g。