Java图形图像解释?

标签 java image double buffer graphic

我最近开始做一些简单游戏制作的教程。

到目前为止,这是我可以理解或已经理解的非常基本的内容。 不过,我刚刚完成了有关双缓冲的教程 - 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解释绘画是如何工作的

根据其他评论进行更新

通常,直接绘制到顶级容器(例如 JFrameJPanel)是一个坏主意。相反,您应该使用诸如 JPanel 之类的东西并重写 paintComponent 方法。

Swing 组件已经是双缓冲的,因此您无需太担心。

参见Performing Custom Painting了解更多详情

关于Java图形图像解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19803861/

相关文章:

html - 将图像从 XML 插入到 XSL 文档

c++ - 为什么我的数字在我的猜数字游戏中计算不正确?

java - 关于JLabel的基本问题

java - 将 Double 数组转换为 BigDecimals 数组

java - Spring/Jaxb2Marshaller/MOXy 不加载 package-info.java 命名空间映射

java - Java中的八进制转义导致错误的字节值,编码问题?

java - 如何在 Java 中裁剪带有负裁剪边界的图像?

按钮上的 C# 图标(调整大小)

java - 除以两个 'double' 数时, 'int' 答案不正确

java - 环境变量在 websocket 中不可用