优化Java图形

优化Java图形,java,optimization,graphics,Java,Optimization,Graphics,我为我的java应用程序绘制了一个自定义UI。现在我从头开始绘制整个UI。我知道UI的某些部分是静态的。我知道我可以将这些静态部分保存到图像中,但这会提高性能吗(因为即使是每帧都必须绘制图像) 在绘制UI后保存对Graphics2D对象的引用,并在每一帧(从绘制所有静态组件的点开始)将其分配给新的图形对象是否合理 提前感谢,, Alan如果屏幕的某些部分完全是静态的,则永远不要重新绘制该部分。不要进行全屏/窗口清除,只需清除屏幕/窗口中不断变化的部分即可 这样,您就不需要不必要地重画静态图像。您

我为我的java应用程序绘制了一个自定义UI。现在我从头开始绘制整个UI。我知道UI的某些部分是静态的。我知道我可以将这些静态部分保存到图像中,但这会提高性能吗(因为即使是每帧都必须绘制图像)

在绘制UI后保存对
Graphics2D
对象的引用,并在每一帧(从绘制所有静态组件的点开始)将其分配给新的图形对象是否合理

提前感谢,,
Alan

如果屏幕的某些部分完全是静态的,则永远不要重新绘制该部分。不要进行全屏/窗口清除,只需清除屏幕/窗口中不断变化的部分即可


这样,您就不需要不必要地重画静态图像。

您不需要重画每一帧中的所有内容。所以,如果您的UI中有静态部分(甚至是动态部分,您知道它们自上一帧以来没有改变),那么您就不需要重新绘制它们

在我的代码(主要是摇摆游戏和模拟)中,我通常尝试遵循以下规则:

  • 预准备静态图像(例如,UI元素的BuffereImage纹理)
  • 分别重写每个UI元素的paintComponent()方法以进行绘制
  • 只有当我知道某些内容已更改时,才调用任何给定UI元素的repaint()方法
  • 在基于计时器的动画循环中调用repaint(),但仅在正在设置动画的UI部分(例如嵌套的JPanel)上调用它

  • 这种方法似乎很有效,而且性能也很好(不过如果有改进的方法,我欢迎大家发表意见!!)

    这里有两种主要的优化方法。第一个是确保当您导致UI重新绘制时(通常通过调用repaint来完成),确保在指定已更改的矩形时调用repaint的版本。仅使矩形足够大,以包含实际已更改的零件,而不是静态零件。要使其有效,还必须注意在paint()中传递的Graphics2D对象中的clipRect。系统使用它来准确地告诉您需要重新绘制的内容,在上述情况下,通常是传递给重新绘制的矩形。不要画完全位于矩形外的任何东西

    通过在映像中缓存接口的静态部分,还可以显著提高性能。到目前为止,写一张图片是把东西放到屏幕上最快的方式。我的测量结果表明,小图像甚至比几个简单的绘图原语都要快。但是,您需要使用createCompatibleImage()确保图像特征与屏幕匹配


    当然,您可能会使用大量内存来加速。我建议在实现之前进行测试,看看是否需要进行图像缓存。

    我完全确定,所以我不会给出这个答案。我认为您可以重写paint()方法,只绘制更新的项目,但这需要您始终知道需要重新绘制的内容。如果你只是想加快速度。也许看看这个:当你说‘我从头开始画整个UI’的时候,你在哪里这么做?您是否有一个单独的定制JComponent,还是有一个包含许多定制组件的JFrame。让repait方法检查脏布尔值,该布尔值在组件需要重新绘制时设置为true。我认为这就是Swing加快重新绘制过程的方法。