gpt4 book ai didi

Java Doublebuffer - 为什么我们要清除暴露区域?

转载 作者:行者123 更新时间:2023-12-01 11:14:21 27 4
gpt4 key购买 nike

我是 Java 图形方面的新手,所以稍微解释一下就会有帮助。

我在Java双缓冲上找到了这个片段,其中我不明白为什么我们要清除刚刚加载图形的暴露区域。

看起来我们加载了图形,然后我们就清理了它?但为什么? (第三个代码块)

任何有关它及其之外的解释都会有帮助。

class DoubleBufferedCanvas extends Canvas {

public void update(Graphics g) {
Graphics offgc;
Image offscreen = null;
Dimension d = size();

// create the offscreen buffer and associated Graphics
offscreen = createImage(d.width, d.height);
offgc = offscreen.getGraphics();

// clear the exposed area ----------- T H I S B L O C K --------
offgc.setColor(getBackground());
offgc.fillRect(0, 0, d.width, d.height);
offgc.setColor(getForeground());

// do normal redraw
paint(offgc);
// transfer offscreen to window
g.drawImage(offscreen, 0, 0, this);
}
}

最佳答案

因为之前绘制到屏幕外图像上的内容仍然存在。

首先,这不是 Swing,这是 AWT

试着这样想一下。在 Swing(以及许多其他基于图形的框架)中,它就像一 block 最艺术的 Canvas ,首先在其上绘制的内容仍然会保留,除非您先在其上绘制

让我们仔细看看代码...

// Reference to the image's Graphics context
Graphics offgc;
// Backing image
Image offscreen = null;
// Current size of the component
Dimension d = size();

// create the offscreen buffer and associated Graphics
offscreen = createImage(d.width, d.height);
// Get a reference to the backing buffer's Graphics context
offgc = offscreen.getGraphics();

// The image has a default color (black I think), so we
// fill it with components current background color
// clear the exposed area ----------- T H I S B L O C K --------
offgc.setColor(getBackground());
offgc.fillRect(0, 0, d.width, d.height);
// Set the default color to the foreground color
offgc.setColor(getForeground());

// do normal redraw
paint(offgc);
// transfer offscreen to window
g.drawImage(offscreen, 0, 0, this);

现在,可能不需要它,因为 paint 方法将尝试执行的操作之一就是使用背景颜色本身填充 Graphics 上下文。另外,代码可能应该调用 super.update(offgc); 而不是调用 paint(offgc);...

我还建议不要打扰 snipet,而是专注于使用已经双缓冲的 Swing 组件或使用 BufferStrategyBufferStrategy and BufferCapabilities如果您想总体控制绘画过程。

此外,请查看 Painting in AWT and SwingPerforming Custom Painting有关 AWT 和 Swing 中绘画工作原理的更多详细信息

关于Java Doublebuffer - 为什么我们要清除暴露区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32002174/

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