Как быстро загрузить 150 статических объектов ImageIcon ок. 1 КБ каждый - PullRequest
2 голосов
/ 06 февраля 2012

У меня около 150 картинок (все довольно маленькие = 1 КБ) в статическом классе и в таких выражениях

public final static ImageIcon I_ADDFAV = new ImageIcon("icons/addfavorite.gif");
public final static ImageIcon I_AUTO_LOAD = new ImageIcon("icons/auto_load.gif");
...

Я использую их для отображения кнопок J с кнопкамиВо время запуска приложения я заметил увеличение времени загрузки, связанное с этими утверждениями, примерно на 2 секунды.Я хотел бы знать, если кто-нибудь знает более быстрый способ загрузки этих картинок.Я думал, что все они в одном файле могут быть подходящим способом, так как я подозреваю, что чтение 150 маленьких файлов с диска - это реальная задержка в этом.Но я могу ошибаться.У кого-нибудь есть умная идея или когда-либо справлялся с такой ситуацией?Мы хотели бы довести это до msecs.

cheers ioannis

Ответы [ 3 ]

1 голос
/ 06 февраля 2012

Обычный трюк заключается в использовании мозаичного изображения, так что вы попадаете на диск только один раз. Примером этого является изображение Google (или даже Stack Overflow ), используемое для этой цели. В веб-приложении отдельные значки нарезаются и обрезаются с использованием свойств фона CSS (а само изображение обрабатывается с использованием срока действия кэша в далеком будущем).

В Java один из подходов, который вы можете использовать, - это использование getSubImage(int,int,int,int) метода BufferedImage для извлечения всех отдельных значков с быстрым доступом в памяти и последующего создания ImageIcon с те и положить их на ваши кнопки.

1 голос
/ 06 февраля 2012

Я бы порекомендовал объединить все изображения в один файл, так же как веб-сайт должен объединить все свои запросы изображений в один запрос для набора спрайтов . Почти все время, затрачиваемое на загрузку файла с диска, затрачивается на поиск (перемещение головки на нужную дорожку на диске) и задержку вращения (ожидание вращения диска, чтобы головка находилась над правильными битами). Таким образом, время чтения большого файла с диска по существу совпадает с временем чтения большого количества маленьких файлов с диска, и, когда большое изображение находится в памяти, вы можете разделить все спрайты и показать их на своих кнопках.

0 голосов
/ 06 февраля 2012

Я хотел бы ответить на этот вопрос. Я использовал идеи выше и сократил время загрузки до миллисекунд. В интересах заинтересованных читателей:

1) Я отсортировал все мои GIF-файлы. 2) Я объединил их, используя copy / B в один GIF 3) Я использовал редактор, чтобы отметить начало каждого из GIF-файлов в объединенном файле 4) Я загрузил файл с помощью RandomAccessFile.readFully и прочитал байты каждого из файлов 5) Затем я использовал ImageIcon (байты), чтобы связать значки приложения с прочитанными байтами.

Конечный результат был более чем удовлетворительным с точки зрения производительности.

Спасибо

...