2015-02-02 2 views
1


Мне нужно загрузить шрифт из файла, и я заметил, что Font.createFont() занимает около 5 секунд для завершения создания шрифта. Вот соответствующий отрывок из моего класса управления ресурсами:Альтернатива Font.createFont()?

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 из файла, или я делаю что-то ужасно неправильно?
Спасибо за ваше время и у вас хороший день!
Alex

+0

Я ничего не знаю о Java, но столкнулся с аналогичной проблемой в SpriteKit/Objective C. Оказалось, что я загружал все семейство шрифтов и все варианты этого шрифта. Это заняло 4-6 секунд. Когда я использовал другой метод, который загружал только определенный стиль (например, Regular или Bold), он занимал 100 мс. – GilesDMiddleton

+0

Первоначально я думал, что задержка может быть связана с наличием шрифта в системе. Но оказывается, что присутствует ли шрифт или нет в системе, задержка остается той же. Также это единственный регулярный шрифт, поэтому я не думаю, что это связано с количеством загруженных шрифтов –

ответ

1

createFont(int fontFormat, InputStream fontStream) создает новый файл, когда файл уже существует (для которого требуется/проверяет права на запись - еще одна стоимость исполнения).

Итак, если вы хотите создать шрифт из потока - к сожалению, альтернатив нет. Обратите внимание, что это на самом деле очень удобно, когда, например, шрифт упакован в JAR.

По этой причине существует еще один статический метод

createFont(int fontFormat, File fontFile)

Как у вас есть шрифт в виде файла, удобно и лучше использовать это.

Это гораздо более эффективным и удобным для тех случаев, - и гораздо быстрее (не создавая против Создание временного файла)

В среднем это будет в 3 раза быстрее, в результате.

0

Что выход вашего кода линии

System.out.println("Operation took: " + (System.nanoTime() - startTime)/1000000); 

? Когда я запускаю свой код на своей машине, загрузка шрифта занимает около 43 мс (миллисекунды). Nano btw означает 1 миллиард - см. https://en.wikipedia.org/wiki/Nano-. Поэтому, если вы сравните наносекунды и разделите их на 1 000 000, вы получите миллисекунды, а не секунды.

Если вам по-прежнему требуется много времени, попробуйте кэшировать сгенерированные шрифты. Сколько разных шрифтов вы хотите создать? Я вижу, что у вас есть три переменные, которые составляют ваши сгенерированные шрифты: fontName, fontSize и antiAlias - сколько у вас перестановок?

+0

Выходной файл sysout 5439 .. Я знаю, что nano = 10^-9 секунды. Иначе задержка не будет заметна. –

+0

Я просто загружаю один обычный шрифт из файла –

+0

Если вы просто загружаете один шрифт, примените один размер и один параметр antiAlias , вы должны кэшировать сгенерированный шрифт. Он будет принимать только 5 секунд один раз, а не каждый раз, когда вам нужен шрифт. Это приемлемо для вас? – Alexander