我该如何有效地找到Graphics2D渲染错误?

4

你能否建议一种通过调试器识别渲染错误来源的方法?

Misko Hevery 错误分类为三类:

  • 逻辑错误
  • 连线错误
  • 渲染错误

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

我有一个包含多个图层的Panel Swing应用程序。渲染所有图层可能需要相当长的时间,因此该应用程序使用一个线程池将图层和图层的图块渲染到BufferedImages中。当事件分派线程开始渲染面板时,最近渲染的BufferedImages被绘制到屏幕上。

这个设置已经表现得足够好了。

一个新的特性需要某种类型的图层支持透明度。但某处似乎没有保留透明度。错误可能出现在多个地方,可能在要渲染的对象的实现中出现错误,也可能在离线渲染线程实现中出现错误。在EDT渲染代码中,许多BufferedImages可能没有正确地组合在一起。

我不要求任何人查看代码并告诉我错误出现的位置。

我想知道人们在解决Graphics2D渲染问题时发现的特别有效的技术是什么。
我非常支持单元测试,但我更喜欢从其他技术开始。
有没有一种方法或诀窍可以从调试器中直观地检查BufferedImage或Graphics2D对象?
在Netbeans变量和监视窗口中,Netbeans有时使用PropertyEditors显示变量值。在这个示例图像中,foregroundColor和backgroundColor的值显示为Color值的小色块。
是否有一种简单的方法来添加/启用Netbeans PropertyEditor,以显示BufferedImage的内容?
我可以临时将代码与各种遇到的BufferedImages方法调用混合在一起,将它们写入磁盘,以便可以离线检查它们。这可能有效,但很麻烦,因为需要将磁盘上的文件与源代码匹配。
你会怎么做?

你正在为 BufferedImage 指定什么类型? - MadProgrammer
1
没有简单的方法可以实现这一点,我会从减少渲染层数开始,并允许检查每一层。我可能会将一些内容写入磁盘,甚至考虑查看 DebugGraphics,例如:这里 - MadProgrammer
@MadProgrammer,涉及到许多BufferedImage,但它们都是像这样创建的BufferedImage mBufferedImage = new BufferedImage((int) d.getWidth(), (int) d.getHeight(), BufferedImage.TYPE_INT_ARGB); - Ryan
1个回答

2

关于清空缓冲区的方法,您可以参考这里的做法。

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

在最糟糕的情况下,您可以在访问您的图像时中断,并以十六进制显示设置观察表达式image.getRGB(0,0)。高位字节是alpha值:FF表示不透明,而00..FE表示变化的透明度。

你的第一个建议 - 我理解为“寻找与已知有效模式不同的代码” - 是个好建议。问题在于有相当多棘手的代码需要检查。 - Ryan
我认为你的第二个建议本质上是“不要检查整个图像。观察单个已知像素的透明度。” 我认为对于我的情况,这是更好的建议。 - Ryan
好的,根据图像你需要推断出要检查哪个角落;当你捕捉到错误帧时,你可能会发现尝试使用不透明颜色和/或错误模式进行清除。 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接