我最近开始做一些简单游戏制作的教程。
到目前为止,这是我可以理解或已经理解的非常基本的内容。 不过,我刚刚完成了有关双缓冲的教程 - http://youtu.be/4T3WJEH7zrc
无论如何,我无法理解的代码是这样的:
public void paint(Graphics g) {
dbImage = createImage(getWidth(), getHeight());
dbg = dbImage.getGraphics();
paintComponent(dbg);
g.drawImage(dbImage, 0, 0, this);
}
public void paintComponent (Graphics g) {
g.fillOval(x, y, 15, 15);
repaint();
}
因此,您创建了窗口的图像,然后创建了该图像的图形(不太确定有什么区别,也找不到足够简单的定义来满足)。 然后,您将图像传递到创建椭圆形的第二个方法中,然后通过重绘更新窗口(我很确定)。最后,回到绘图中,绘制图像。
因此,如果有人可以向我解释信息流以及图形与图像和重绘命令之间的区别,我将非常感激 - 干杯!
最佳答案
这是所谓的双缓冲的基本示例。您不是直接绘制到设备(通过 Graphics 上下文),而是首先将所有内容渲染到缓冲区(在本例中为 dbImage),然后绘制您需要的所有内容。
完成后,您可以在一个绘制步骤中将生成的图像渲染到设备的Graphics
上下文中。这可以减少在短时间内进行大量更改时的闪烁。
dbImage = createImage(getWidth(), getHeight());
“创建用于双缓冲的离屏可绘制图像”,请参阅 Component#createImage
了解更多详情。
dbg = dbImage.getGraphics();
获取图像Graphics
上下文。这是一个统一的绘画 API,可以轻松地绘制到多个不同的源,例如屏幕、打印或图像
paintComponent(dbg);
将绘画加载到另一个方法,正如您所说,它绘制一个椭圆形
g.drawImage(dbImage, 0, 0, this);
将结果渲染到屏幕
这个例子有点糟糕。
您应该避免调用 repaint
或任何可能导致在任何 paint
方法中调用 repaint
的方法,因为这会导致 paint
再次被调用,这可能很快就会失控。
此外,您应该处理您创建的任何Graphics
上下文。
我会考虑...
Image dbImage = createImage(getWidth(), getHeight());
dbg = dbImage.getGraphics();
paintComponent(dbg);
dbg.dispose()
g.drawImage(dbImage, 0, 0, this);
作为一个稍微好一点的例子
Also I've just realised, nowhere else in my code are those methods called.... how are they just called for no reason?
参见Painting in AWT and Swing解释绘画是如何工作的
根据其他评论进行更新
通常,直接绘制到顶级容器(例如 JFrame
或 JPanel
)是一个坏主意。相反,您应该使用诸如 JPanel
之类的东西并重写 paintComponent
方法。
Swing 组件已经是双缓冲的,因此您无需太担心。
参见Performing Custom Painting了解更多详情
关于Java图形图像解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19803861/