【问题标题】:How can I maximize rendering speed of a panel and its components?如何最大化面板及其组件的渲染速度?
【发布时间】:2020-07-26 22:52:11
【问题描述】:

我创建了一个简单的初始屏幕,它基本上是一个带有背景图像的JFrame、两个JLabels 和一个JProgressbar。当我只用背景图像渲染框架时,大约需要 200 毫秒,这是启动画面的好时机。

但只要我添加一个 JLabel(使用 Sansserif 字体)就需要两秒钟!因此,创建字符串的时间是渲染图像的 9 倍。

如何降低 JLabels 或面板的渲染速度?

private static final Dimension LOADINGSCREEN_DIMENSION = new Dimension(400, 400);

private LoadingScreen() {
    super();
    this.setUndecorated(true);
    this.setResizable(false);
    this.setLayout(new BorderLayout(0, 0));
    this.setSize(LOADINGSCREEN_DIMENSION);
    this.setPreferredSize(LOADINGSCREEN_DIMENSION);
    this.setContentPane(createContentPane());

    //UNCOMMENT THIS LINE and it will take about 2 seconds to create
    //this.add(createInformationLabel(), BorderLayout.SOUTH);

    //Set location and pack
    final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2);
}

private JLabel createInformationLabel() {
    JLabel infoLabel = new JLabel("Label");
    infoLabel.setFont(new Font("SansSerif", Font.PLAIN, 12));
    infoLabel.setHorizontalAlignment(SwingConstants.RIGHT);
    infoLabel.setBorder(new EmptyBorder(50, 0, 10, 20));
    infoLabel.setOpaque(false);
    return infoLabel;
}

【问题讨论】:

    标签: java swing jpanel rendering jlabel


    【解决方案1】:

    这与渲染速度无关。所有这些的渲染速度都在几十毫秒的数量级。

    您看到的性能损失与加载类有关。在渲染 JFrame 之前,需要加载它的类,以及它所依赖的所有类,等等。然后你正在实例化一个JLabel。需要加载这个类,以及它所依赖的所有类。然后你正在实例化一个Font,所以需要加载所有与字体相关的类。我不知道,但甚至可能会发生一些“字体子系统初始化”。你明白了。

    因此,就目前而言,您无法避免这种开销。

    您可以尝试跳过标签并使用“图形”自己呈现文本,但我不能保证您会通过这种方式看到任何改进。

    你也可以看看SplashScreen这个组件,希望能优化一下,尽量少的类,尽快加载,不过我没有经验。而且,您可能无法通过 JLabel 或自己渲染来向其中添加文本,或者如果您这样做,您可能会遭受当前遇到的所有开销。

    【讨论】:

    • 我已经尝试过使用图形来渲染字体,但一点改进都没有。
    【解决方案2】:

    我还有另一个答案给你。您的问题可能与此问题有关,该问题仍未解决:

    JDK-8179209 文本渲染初始化时间慢

    https://bugs.openjdk.java.net/browse/JDK-8179209

    简而言之,java swing加载字体需要很长时间,除了开始在后台加载字体之外没有其他解决方案,在加载字体的同时继续做其他应用程序启动相关的事情而不尝试渲染任何文本,然后在加载字体后最终开始渲染文本。 openjdk issue 包含一些实现此目的的示例代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 2021-03-05
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2012-02-07
      相关资源
      最近更新 更多