获取字体指标真的很慢

时间:2010-03-16 13:48:07

标签: java performance swing font-size

所以我遇到的问题是我通过显示一个简单的菜单来启动我的应用程序。要正确调整和对齐文本,我需要获取字体指标,但我找不到快速完成的方法。我测试了我的程序,它看起来像我用来获取字体度量的任何方法,第一次调用超过500毫秒!?因此,启动我的应用程序所需的时间远远超过必要的时间。

我不知道它是否是特定于平台的,但为了以防万一,我在MacBook Pro上使用Mac OS 10.6.2(这里的硬件不是问题)。

如果您知道更快获得字体指标的方法,请提供帮助。

我尝试了这三种方法来获取字体指标,无论我选择哪种方法,第一次调用总是很慢。

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;

import javax.swing.JFrame;

public class FontMetricsTest extends JFrame {
 public FontMetricsTest() {
  setVisible(true);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

 @Override
 public void paint(Graphics g) {
  Graphics2D g2 = (Graphics2D) g;

  Font font = new Font("Dialog", Font.BOLD, 10);
  long start = System.currentTimeMillis();

  FontMetrics fontMetrics = g2.getFontMetrics(font);
//  LineMetrics fontMetrics1 =
//     font.getLineMetrics("X", new FontRenderContext(null, false, false));
//  FontMetrics fontMetrics2 = g.getFontMetrics();

  long end = System.currentTimeMillis();
  System.out.println(end - start);
  g2.setFont(font);
 }

 public static void main(String[] args) {
  new FontMetricsTest();
 }
}

2 个答案:

答案 0 :(得分:2)

虽然我无法告诉您如何解决问题本身,但您可以使用此方法确定何时启动它:

new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_GRAY).createGraphics().getFontMetrics();

这很有用,因为您可以将放在任何地方 - 因此,例如,您可以在显示加载屏幕时执行此操作。如果您在Graphics期间使用paint()对象,那么您只能在渲染时进行初始化。

编辑:

事实上,这可以简化为:

FontUtilities.getFont2D(new Font("Dialog", 0, 12));

(慢速部分是getFont2D调用,而不是Font构造函数。)

编辑2:

最后,这可以简化为:

sun.font.FontManagerFactory.getInstance();

问题是这个单例类需要很长时间才能启动,因为它枚举了所有系统字体。

编辑3:

如果你想使用标准的图形系统,没有办法解决这个问题。

答案 1 :(得分:1)

没有真正的线索,为什么它如此缓慢,但对于方法3,你不应该首先调用'setFont'吗?

public void paint(Graphics g) {
    g.setFont(font);
    FontMetrics fm = g.getFontMetrics();
}

尽管如此,它在速度方面没有任何区别: - (

此外,每次调用Font时都会创建一个新的paint()有点不经济(发生了很多),你可以将它移到你的构造函数中。但这不是问题所在,因为只有在创建了Font之后才开始测量时间。