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,你得到的是毫秒,而不是秒。
如果您的系统仍然需要很长时间 - 您是否尝试过缓存生成的字体。您的代码将生成多少种不同的字体?我看到你有三个变量组成你生成的字体:fontName
、fontSize
和 antiAlias
- 你有多少排列?
我需要从文件加载字体,我注意到 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,你得到的是毫秒,而不是秒。
如果您的系统仍然需要很长时间 - 您是否尝试过缓存生成的字体。您的代码将生成多少种不同的字体?我看到你有三个变量组成你生成的字体:fontName
、fontSize
和 antiAlias
- 你有多少排列?