Java图像闪烁

标签 java swing timer paint double-buffering

从 Google 搜索中我可以看到这个问题被问了很多,但我找到的解决方案都没有为我解决这个问题。我正在用 Java 制作一个带有图像的游戏,你知道,因为游戏通常都有这些东西。但整个表格一直在闪烁,我无法让它停止。是的,我对它进行了双缓冲并覆盖了 update() 方法,虽然这确实有帮助,但闪烁仍然存在。我不知道我是否在双缓冲方面做错了什么,或者我是否需要完全不同的东西。

起初我以为这可能与clearRect()行有关,但删除它后,游戏仍然闪烁,但当然不是每次都被清除。所以这根本没有帮助。减慢计时器速度后,闪烁几乎完全消失,但我需要将其减慢至 100 毫秒,即便如此,我仍然会出现一些闪烁。此外,这对于游戏来说太慢了。我尝试让一个计时器在 10 毫秒的计时器上完成所有操作,并用另一个计时器以 100 毫秒的速度进行绘画,但当时看起来很不稳定。我可以将绘画计时器减慢到大约 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);
    }

最佳答案

不要直接在顶级窗口(例如 JApplet 或 JFrame)的 paint(...) 方法中进行绘制,否则您将失去所有双缓冲和所有 Swing 功能。而是使用添加到 JApplet 的 JPanel 或其他 JComponent 派生组件(包括 JComponent 本身)的 paintComponent(...) 方法进行绘制。

如果您在此处或在 Google 中搜索该主题,您会发现该问题已在本网站和其他网站上被多次询问和回答,而且答案是相同的。

例如

关于Java图像闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10442172/

相关文章:

java - 如何阻止图像移动两次?

javascript - qtScript 上 JavaScript 的 setTimeout 的等价物是什么?

android - 关于定时器和 Action ...帮助!!----(安卓应用程序)

java - 通过更改 Activity 导致黑屏

java swing 与 mvc : is this pattern indeed possible?

Java Swing 空指针异常

java - 从外部方法更改 void GUI 构造函数的 JLabel 值

java - 在 keyPressed 事件上显示 jlabell 中的 jtextfield 数据

java - Spring boot + gradle 将命令行参数传递给 application.property

java - 如何执行更新