Java AWT: Font - это легкий объект? - PullRequest
10 голосов
/ 24 мая 2011

Сколько стоит создание объекта Font, когда я использую AWT Java? Должен ли я кэшировать Font всякий раз, когда это целесообразно, или это просто облегченная ссылка на тяжелый шрифт, который AWT уже кэширует внутри?

1 Ответ

7 голосов
/ 24 мая 2011

Если вы посмотрите на исходный код для шрифта (это OpenJDK), конструкторы с именем, стилем, размером, очевидно, легковесны:

public Font(String name, int style, int size) {
    this.name = (name != null) ? name : "Default";
    this.style = (style & ~0x03) == 0 ? style : 0;
    this.size = size;
    this.pointSize = size;
}

Однако конструктор, который принимает файл и формат шрифта:

private Font(File fontFile, int fontFormat,
             boolean isCopy, CreatedFontTracker tracker)
    throws FontFormatException {
    this.createdFont = true;
    /* Font2D instances created by this method track their font file
     * so that when the Font2D is GC'd it can also remove the file.
     */
    this.font2DHandle =
        FontManager.createFont2D(fontFile, fontFormat,
                                 isCopy, tracker).handle;
    this.name = this.font2DHandle.font2D.getFontName(Locale.getDefault());
    this.style = Font.PLAIN;
    this.size = 1;
    this.pointSize = 1f;
}

, который явно тяжелый (особенно часть FontManager.createFont2D(...). Этот конструктор используется только Font.createFont ().

В целом, если вы используете шрифт, который есть в вашей системе, все в порядке, просто создайте его и назовите его по имени. Если вы предоставляете свой собственный шрифт (т. Е. Из файла TrueType), возможно, лучше его кэшировать. (Тем не менее, IIRC, есть способ просто загрузить файл в кеш AWT, чтобы вы могли просто ссылаться на него по имени.)

Копание дальше в исходный код, все функции, такие как getFamily (), getFontName (), getNumGlyphs (), первый вызов getFont2D (), который по сути:

private Font2D getFont2D() {
    // snip
    if (font2DHandle == null) {
        font2DHandle =
            FontManager.findFont2D(name, style,
                                   FontManager.LOGICAL_FALLBACK).handle;
    }
    /* Do not cache the de-referenced font2D. It must be explicitly
     * de-referenced to pick up a valid font in the event that the
     * original one is marked invalid
     */
    return font2DHandle.font2D;
}

так, это показывает, что каждый шрифт определенно легкий, и он извлекает необходимую информацию из FontManager, который отвечает за кеширование шрифта.

...