簡體   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