Font.createFont() 的替代方案?

Alternative to Font.createFont()?


我需要从文件加载字体,我注意到 Font.createFont() 每个字体创建需要大约 5 秒才能完成。这是我的资源管理的相关摘录 class:

    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 还是我做错了什么?
感谢您的宝贵时间,祝您有美好的一天!
亚历克斯

createFont(int fontFormat, InputStream fontStream) 在文件已经存在时创建一个新文件(requires/checks 写权限 - 另一个性能成本)。

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

出于这个原因,还有另一种静态方法

createFont(int fontFormat, File fontFile)

既然你有一个字体文件,用这个比较方便,效果更好。

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

平均而言,结果会快 3 倍。

你的代码行的输出是什么

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

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

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