替代 Font.createFont()?

Posted

技术标签:

【中文标题】替代 Font.createFont()?【英文标题】:Alternative to Font.createFont()? 【发布时间】:2015-04-01 12:04:43 【问题描述】:

我需要从文件加载字体,我注意到 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 或者我做错了什么? 感谢您的宝贵时间,祝您有美好的一天! 亚历克斯

【问题讨论】:

我对 Java 一无所知,但在 SpriteKit/Objective C 中遇到了类似的问题。结果我正在加载整个字体系列和该字体的所有变体。花了4-6秒。当我使用仅加载特定样式(例如常规或粗体)的不同方法时,需要 100 毫秒。 最初我认为延迟可能是由于系统中字体的可用性。但事实证明,无论字体是否存在于系统中,延迟都是一样的。它也是一种单一的常规字体,所以我不认为这是由于加载的字体数量造成的 【参考方案1】:

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

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

因此还有另一种静态方法

createFont(int fontFormat, File fontFile)

由于您有一种字体作为文件,因此使用它更方便且更好。

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

因此,平均速度会快 3 倍。

【讨论】:

【参考方案2】:

你的代码行的输出是什么

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

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

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

【讨论】:

sysout 的输出是 5439.. 我知道 nano = 10^-9 秒.. 否则延迟不会明显.. 我只是从文件中加载一种常规字体 如果你只加载一种字体,应用一种大小和一种抗锯齿设置,你应该缓存生成的字体。然后它只需要 5 秒一次,而不是每次你需要字体时。你可以接受吗?

以上是关于替代 Font.createFont()?的主要内容,如果未能解决你的问题,请参考以下文章

Java:字体不加载(来自外部文件)

python实现替代密码与置换密码

替代拉链的替代方式

替代:替代评估

NCS8823替代方案|NCS8823芯片替代方案|CS5260替代NCS8823方案电路

Markdown 替代品 Asciidoc 介绍