替代 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,您得到的是毫秒,而不是秒。
如果您的系统仍然需要很长时间 - 您是否尝试过缓存生成的字体。您的代码将生成多少种不同的字体?我知道你有三个变量组成你生成的字体:fontName
、fontSize
和 antiAlias
- 你有多少排列?
【讨论】:
sysout 的输出是 5439.. 我知道 nano = 10^-9 秒.. 否则延迟不会明显.. 我只是从文件中加载一种常规字体 如果你只加载一种字体,应用一种大小和一种抗锯齿设置,你应该缓存生成的字体。然后它只需要 5 秒一次,而不是每次你需要字体时。你可以接受吗?以上是关于替代 Font.createFont()?的主要内容,如果未能解决你的问题,请参考以下文章