【问题标题】:How can I effectively find a Graphics2D rendering error?如何有效地找到 Graphics2D 渲染错误?
【发布时间】:2014-08-18 21:54:58
【问题描述】:

您能否建议一种从调试器中识别呈现错误来源的方法?

Misko Hevery classifies 将错误分为三类:

  • 逻辑
  • 接线
  • 渲染

我很清楚我的问题是渲染错误。

我有一个带有包含多个层的面板的 Swing 应用程序。渲染所有图层可能需要大量时间,因此应用程序使用线程池将图层和切片从图层渲染到 BufferedImages。当 Event Dispatch Thread 渲染面板时,最近渲染的 BufferedImage 会被绘制到屏幕上。

此设置运行良好。

一项新功能要求某种图层类型支持透明度。某处,某处没有保持透明度。错误可能在很多地方,可能在要渲染的对象的实现中,错误可能在离线渲染线程的实现中。许多 BufferedImage 在 EDT 渲染代码中可能没有正确组合在一起。

我没有要求任何人查看代码并告诉我错误在哪里。

我想知道人们发现哪些技术在解决 Graphics2D 渲染问题时特别有效。

我是单元测试的坚定支持者,但我更愿意从另一种技术开始。

是否有一种方法或技巧可以从调试器中直观地检查 BufferedImage 或 Graphics2D 对象?

在 Netbeans 变量和监视窗口 Netbeans 有时使用 PropertyEditor 来显示变量值。在此示例图像中,foregroundColor 和 backgroundColor 的值显示为 Color 值的小样本。

是否有一种简单的方法可以添加/启用 Netbeans PropertyEditor 来显示 BufferedImage 的内容?

我可以使用方法调用临时将代码洒在代码中,以将遇到的各种 BufferedImage 写入磁盘,以便随后可以离线检查它们。它可能有效,但将磁盘上的文件与源代码相匹配会很乏味。

你会怎么做?

【问题讨论】:

  • 你为BufferedImage指定什么类型?
  • 没有简单的方法来实现这一点,我将从减少渲染层的数量开始,并允许检查每一层。我可能会写一些到磁盘,我什至可以考虑看看DebugGraphicsfor example
  • @MadProgrammer 涉及到很多 BufferedImages 但它们都是这样创建的 BufferedImage mBufferedImage = new BufferedImage((int) d.getWidth(), (int) d.getHeight(), BufferedImage.TYPE_INT_ARGB);

标签: java swing debugging netbeans graphics2d


【解决方案1】:

您可以将您的方法与here 中关于清除缓冲区的方法进行比较:

g2d.setComposite(AlphaComposite.Clear);
g2d.fillRect(0, 0, w, h);

在最坏的情况下,您可以在image 可访问的位置中断,并在表达式image.getRGB(0,0) 上设置监视,并将显示设置为十六进制。高位字节是alpha 值:FF 是不透明的,00..FE 代表不同的透明度。

【讨论】:

  • 您的第一个建议 - 我将其解释为“寻找偏离已知工作模式的代码”是一个很好的建议。问题是要检查很多棘手的代码。
  • 我相信您的第二个建议本质上是“不要检查整个图像。注意单个已知像素的透明度。”我认为对于我的情况,这是更好的建议。
  • 对;您需要根据图像推断要检查的角;当您发现坏帧时,您可能会尝试使用不透明的颜色和/或错误的模式进行清除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 2022-10-21
  • 1970-01-01
  • 2011-04-23
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多