为什么在JFrame上绘图比在JPanel上慢这么多?

9
我的问题是:为什么在JPanel上绘制相同的自定义绘画例程比直接在JFrame上绘制快近16倍?这只是双缓冲吗?这肯定不可能吧?
背景:当JFrame未被遮挡时(尤其是部分遮挡时),我遇到了自定义绘图不刷新的问题。在搜索了SO之后,我决定咬紧牙关,弄清楚如何将JPanel的子类连接到一个NetBeans表单设计器中。
对于处于相同情况的任何人:在NetBeans中,您需要创建一个新的标准类(而不是JPanel表单),该类恰好扩展JPanel,并在其中手动编写所有内容(没有GUI设计器,就像好老的日子一样)。然后,您向表单添加一个标准的JPanel,设置其大小;然后右键单击并选择“自定义代码”,并在组合框中选择“自定义创建”...它会创建一个新的javax.swing.JPanel替代您的子类。
所以...这使我能够“正确地”在组件上绘制,而不是直接在表单上绘制。此外,面板的键监听器比劫持帧键事件调度程序更加简洁。
无论如何,现在分析器说,在JPanel的paintComponent()中执行的完全相同的自定义绘画代码与JFrame的paint()相比快近16倍...我想知道是否有人可以解释一下为什么。
提前感谢。Keith。
编辑:这个问题是基于错误的度量标准。分析器没有包括/报告JPanel的paintComponent()方法在AWT-EventQueue线程中,而我的基准配置文件确实包括了JFrame的paint()。在问一个傻问题之前,我应该仔细看看。我的错。

分析器(例如VisualVM)应该会告诉你哪些方法花费了更多的时间。这是找出问题所在的好起点。 - Jonathan Drapeau
1
@JonathanDrapeau:你说得对!该配置文件未将paintComponent报告为“AWT-Event-Queue”线程的一部分(而JFrame paint是如此)!因此,这是两种解决方案报告方式的差异。我的错! - corlettk
这是一个非常具体的问题,因为绘制 AWT 组件会更快(来自本地操作系统的对等体)而不是它的子 Swing JComponents,但我们已经在谈论史前时代的图形核心,没有什么地方可以进行速度或优化,您可以将其与 Nimbus 中使用的新图形核心进行比较,并且相同(据我所知)作为 JavaFX 的基础,只有一些小变化。 - mKorbel
1
+1 用于剖析并分享你的奥德赛。如果你 回答自己的问题,你可以引用这里建议的方法来控制GUI编辑器:链接文字 - trashgod
@trashgod:谢谢。我的初始问题是我无法弄清如何将一个新的JPanel子类连接到现有的NetBeans-GUI设计的JFrame中,除了再次开始(叹气)使用非GUI设计的JFrame...这与将JPanel子类添加到新的(空)非GUI设计的JFrame不完全相同,但还是感谢您的回答。您的答案对于它的问题来说真的很好...现在我知道如果需要的话,该怎么做了。《使用NetBeans GUI Designer》应该是一本免费的电子书(或维基)。它不是一个自说明的软件。 - corlettk
2个回答

1
JFrame是一个顶级容器,扩展自aw.Frame,需要本地资源进行绘制,而JPanel是一个Swing组件,由UI线程本身渲染。

0
Swing使用Java2D API进行绘图,根据Java SE 7故障排除指南,Java2D使用一组渲染管道,“可以粗略地定义为不同的渲染基元方式”。更具体地说,Java2D渲染管道似乎将跨平台的Java代码连接到本地图形库(OpenGL、X11、D3D、DirectDraw、GDI),这些库可能支持硬件加速。
在Java 1.6.0_10(也称为6u10)中,为了改善Swing和Java2D应用程序的渲染性能,向Windows添加了基于Direct3D的“完全硬件加速图形管道”(默认情况下启用)。
默认情况下,在Windows系统上使用Java2D时,默认情况下启用此Direct3D管道和DirectDraw / GDI管道(我假设它们各自用于不同的事情)。"
阅读更多:在Swing应用程序启动期间调用JFrame构造函数的第一个调用需要很长时间(因为java.awt.Window())

抱歉,我不明白为什么Direct3D可以使在JPanel上绘制图像比在JFrame上快得多...而且它确实更快,所以这绝对不仅仅是我的“错误分析”。我猜组件可以通过加速管道进行绘制,而框架则是“原始”的。这在一定程度上是有道理的,因为框架通常只为组件提供“静态背景”,以便渲染所有“易变内容”...我一开始就期望JFrame使用“最佳可用”的图形管道,即使只是为了与JComponent保持一致。感谢您的关注。 - corlettk

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