gpt4 book ai didi

java - 小程序中的双缓冲如何工作?

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

我正在根据 youtube 上有关制作 Java 游戏小程序的视频教程编写这段 Java 代码。然而,讲师并没有真正解释小程序的更新方法是如何实现他所称的双缓冲的。

    import java.awt.*;    import java.applet.Applet;    public class Game extends Applet implements Runnable {    private Image i;    private Graphics g2;    private int x, y, dx = 1, dy = 1, radius = 10;    ...    public void update(Graphics g) {                if ( i == null ) {                    i = createImage(getHeight(), getHeight());                }                g2 = i.getGraphics();                g2.setColor(getBackground());                g2.fillRect(0, 0, getWidth(), getHeight());                g2.setColor(getForeground());                paint(g2);                g.drawImage(i, 0, 0, null);            }    public void paint(Graphics g)             {                x+= dx;                y+= dy;                g.setColor(Color.RED);                g.fillOval(  x, getHeight() - y, radius * 4, radius * 4);                g.setColor(Color.BLUE);                g.fillOval( getWidth() - x - radius, y, radius * 4, radius * 4);                g.setColor(Color.GREEN);                g.fillOval( x, y, radius * 4, radius * 4);                g.setColor(Color.YELLOW);                g.fillOval( getWidth() - x , getHeight() - y , radius * 4, radius * 4);                 }

这里如何消除闪烁?拥有 Image 对象有什么用?拥有另一个 Graphics 对象有什么用,为什么不使用参数 Graphics?

最佳答案

双缓冲的总体思路是绘制速度很慢,如果要绘制很多内容,用户会以闪烁的形式注意到这一点。相反,您将所有绘图都绘制到屏幕外图像(缓冲区)上。然后,当您准备好时,您交换屏幕外缓冲区,以便它现在在屏幕上绘制。这种交换发生得非常快,因为它通常只是更新一个指针。

用户不再看到闪烁,因为所有绘图工作都是在屏幕外完成的。

您发布的代码是双缓冲的变体。所有绘图工作都是在屏幕外的 Image 对象 i 上完成的。绘制完成后,图像对象将被复制到组件,位于 update 方法的最后一行。

我说变体是因为上面的代码不交换缓冲区。相反,您将屏幕外缓冲区 i 复制到屏幕上缓冲区。它仍然消除了闪烁,因为所有渲染工作都是在屏幕外完成的。复制图像还是很快的。

第二个 Graphics 对象之所以存在,是因为您在绘图时应始终使用组件提供的对象。因此,上面的代码向 Image 对象询问其 Graphics 对象。但是,没有真正的理由将 g2 存储为成员变量,您只需每次在 update 中请求它即可。

关于java - 小程序中的双缓冲如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28017158/

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