繁体   English   中英

Java花太长时间来初始化大型OpenType字体

[英]Java takes too long time to initialize large OpenType fonts

我必须在应用程序中使用Noto Sans CJK字体。 但是,当我调用下面的方法时,它需要10秒钟来初始化。

Font font = //Noto Sans CJK font
JComponent.getFontMetrics(An instance of Noto Sans CJK font);

我可以解决此延迟问题吗? 如果该方法可以帮助解决此问题,则代码可能会很复杂(就像实现FontMetrics一样,我也不知道如何)。

请不要推荐我将otf字体转换为ttf字体。 我无法转换它,因为字体工具说它是字母字体,甚至无法加载unicode字形。 另外,我必须在应用程序中使用另一种otf字体。 而且我不会使用已经转换的版本。

  • 如果您可以使用Java代码解决此问题,我想使用此方法。

  • 如果可以将任何Unicode otf字体转换为ttf,我将使用该工具(但必须免费,无试用。完全免费)。 请告诉我如何将otf转换为ttf。 我尝试了网站和fontforge。 两者都返回7KB字体,即使此字体为7MB。

我不擅长英语。 抱歉。

也许您应该提供逐步说明来重现您的问题。

我在系统上进行了追踪。

在我的系统上执行时间不到一秒钟。

以上运行的输出

java.awt.Font[family=Noto Sans CJK JP Regular,name=Noto Sans CJK JP Regular,style=plain,size=10]

real    0m0.522s
user    0m0.565s
sys     0m0.056s

NotoFont.java

import java.awt.Font;
class NotoFont {
    public static void main(String[] args) {
        Font noto = new Font("Noto Sans CJK JP Regular", Font.PLAIN, 10);
        System.out.println(noto);
    }
}

编辑一个示例,从Jar中读取字体文件。 字体未安装在系统上。

假设以下结构。

build/fonts/NotoSansCJKjp-Regular.otf
dist/
NotoFont.java

NotoFont.java

import java.awt.*;
import java.io.*;
import java.swing.*;
class NotoFont {
    private void run() throws FontFormatException, IOException {
        try (InputStream is = this.getClass().getResourceAsStream("/fonts/NotoSansCJKjp-Regular.otf")) {
            Font baseFont = Font.createFont(Font.TRUETYPE_FONT, is);
            Font noto = baseFont.deriveFont(Font.PLAIN, 10);
            System.out.println(noto);
            FontMetrics metrics = new JPanel().getFontMetrics(noto);
            System.out.println(metrics);
        }
    }
    public static void main(String[] args) throws FontFormatException, IOException {
        new NotoFont().run();
    }
}
  • 编译代码

     $ javac -d build/ NotoFont.java 
  • 创建罐子

     $ jar cf dist/notofont.jar -C build/ . 
  • 检查罐子内容

     $ cd dist/ $ jar tf notofont.jar META-INF/ META-INF/MANIFEST.MF NotoFont.class fonts/ fonts/NotoSansCJKjp-Regular.otf 
  • 运行代码

     $ time java -cp notofont.jar NotoFont 

以上运行的输出

java.awt.Font[family=Noto Sans CJK JP Regular,name=Noto Sans CJK JP Regular,style=plain,size=10]
sun.font.FontDesignMetrics[font=java.awt.Font[family=Noto Sans CJK JP Regular,name=Noto Sans CJK JP Regular,style=plain,size=10]ascent=9, descent=3, height=12]
real 3.02
user 2.11
sys 0.84

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM