Font.createFont()的替代?

时间:2015-02-02 14:05:08

标签: java performance fonts awt


我需要从文件加载字体,我注意到Font.createFont()每个字体创建大约需要5秒钟。以下是我的资源管理类的相关摘录:

    try(InputStream in = getClass().getResourceAsStream(FONT_DIR + fontName + FONT_EXT))
    {
        long startTime = System.nanoTime();
        Font awtFont = Font.createFont(Font.TRUETYPE_FONT, in); //<-- This operation takes about 5 seconds
        System.out.println("Operation took: " + (System.nanoTime() - startTime) / 1000000);

        awtFont = awtFont.deriveFont(fontSize);
        result = new TrueTypeFont(awtFont, antiAlias);

    }

我检查了类似的帖子,但我找不到解决方法。所以我的问题是:是否有更快的方法从文件创建java.awt.Font或我做了一些非常错误的事情?
谢谢你的时间,祝你有个美好的一天!
亚历

2 个答案:

答案 0 :(得分:1)

当文件已存在时,

createFont(int fontFormat, InputStream fontStream)会创建一个新文件(这需要/检查写入权限 - 另一项性能成本)。

因此,如果您想从流中创建字体 - 遗憾的是,没有其他选择。请注意,这实际上非常方便,例如当字体打包在JAR中时。

因此,还有另一种静态方法

createFont(int fontFormat, File fontFile)

由于您将字体作为文件,因此使用此字体会更方便。

对于这些案例来说,它更加高效和方便 - 而且速度更快(不创建与创建临时文件)

结果平均值会快3倍。

答案 1 :(得分:0)

代码行的输出是什么

System.out.println("Operation took: " + (System.nanoTime() - startTime) / 1000000);

?当我让你的代码在我的机器上运行时,加载字体需要大约43毫秒(毫秒)。 Nano btw意味着10亿 - 见https://en.wikipedia.org/wiki/Nano-。因此,如果你比较纳秒并将它们除以1,000,000,你得到毫秒,而不是秒。

如果您的系统仍然需要很长时间 - 您是否尝试过缓存生成的字体。您的代码将生成多少种不同的字体?我知道你有三个变量组成你生成的字体:fontNamefontSizeantiAlias - 你有多少个排列?