2013-08-16 86 views
8

我的问题是为什么在JPanel上绘图时,相比直接在JFrame上绘制相同的swing定制绘画例程快近16倍?它只是双缓冲?它不可能,当然?为什么在JFrame上绘制比在JPanel上慢得多?

背景:当JFrame没有被遮挡时(特别是只有部分遮挡),我有一个自定义绘画未刷新的问题。在搜索完毕后,我决定咬紧牙关,想出如何将JPanel的一个子类连接到bluddy-NetBeans形式的设计器表单中。

对于处于同一情况的任何人:在NetBeans中,您需要创建一个新的标准类(而不是JPanel表单),并且手动对所有内容进行编码(无GUI设计器,天,叹了口气)。然后你添加一个标准的JPanel到你的表单中,设置它的大小;然后右键单击并选择“自定义代码”,然后在组合框中选择“自定义创建”......它将创建一个新的javax.swing.JPanel替换其子类。

所以...这让我“正确地做到”并在组件上绘画,而不是直接在窗体上绘画。此外,面板 - 按键 - 监听器是一个比hi-jacking frames key-event-dispatcher更方便的解决方案。

无论如何,现在profiler说完全相同的自定义绘制代码在JPanel的paintComponent()中执行的速度比相同的JFrame的paint()快近16倍......我想知道是否有人能解释为什么。

预先感谢您。基思。


编辑:这个问题是基于误解的指标。 profiler不包括/报告JPanel的paintComponent()方法在AWT-EventQueue线程中,因为我的基线配置文件包含JFrame的paint()。在问一个愚蠢的问题之前,我应该仔细看看。我的错。

+0

分析器VisualVM iirc应该告诉你哪些方法需要更多时间。这将是一个很好的开始,找到正在发生的事情。 –

+0

@JonathanDrapeau:你说得对!配置文件不会报告paintComponent作为“AWT-Event-Queue”线程的一部分(而JFrame绘图是)!所以这两种解决方案的报道方式有所不同。我的错! – corlettk

+0

这是一个非常具体的问题,因为对AWT组件的访问会比它的孩子Swing JComponents更快(同龄人来自本地操作系统),但是我们已经讨论过史前图形核心,没有地方可以比较最优化的东西,一个新的图形核心用于Nimbus和相同的(AFAIK),作为JavaFX – mKorbel

回答

0

“Swing使用Java2D API进行绘制,并且根据此Java SE 7故障排除指南,Java2D使用一组渲染管线,”它可以粗略定义为渲染基元的不同方式“。 Java2D渲染管道似乎将跨平台Java代码连接到可能支持硬件加速的本机图形库(OpenGL,X11,D3D,DirectDraw,GDI)。在Java 1.6.0_10(aka 6u10)中,“完全硬件加速的图形管道“基于Direct3D被添加到Java2D for Windows,以提高Swing和Java2D应用程序的渲染性能(默认启用)

默认情况下,当在Windows系统上使用Java2D时,默认启用Direct3D管道和DirectDraw/GDI管道(我假设它们各自用于不同的事情)。“

往下看:First call to JFrame constructor takes a long time during Swing application startup (because of java.awt.Window())

+0

对不起,我不明白Direct3D如何使Janel上的绘画更加快速以至于JFrame ......并且它明显更快,所以它绝对不是我自己的“糟糕的剖析”。我猜这些组件可以通过加速器管道进行绘制,而框架是“原始”的。考虑到帧通常只是为组件提供“静态背景”,以便将所有“易失性内容”渲染出来,这是有道理的......我只是预见到JFrame会使用“最佳可用”图形管道,即使只是为了与JComponent保持一致。感谢您的关注。 – corlettk

1

的JFrame是一个顶级容器延伸aw.Frame是绘制,而一个JPanel需要原生资源是由UI线程本身呈现Swing组件。