Каков наилучший способ загрузки и кэширования изображений в Java? - PullRequest
4 голосов
/ 29 декабря 2011

У меня есть большая коллекция изображений размером более 16х16 пикселей, которые понадобятся мне для игры, которую я делаю на Java.

Каков наилучший способ хранения плиток без исчерпания доступной памяти JVM?

Я думаю, что порождение 1000+ BufferedImages не может быть мудрым ...

Основная цель сохранения изображений наготове - загрузка карт, которые будут динамически создаваться на основе файла карты.

Ответы [ 3 ]

6 голосов
/ 30 декабря 2011

Во-первых, загрузка всех этих изображений действительно является проблемой.1000 изображений размером 16 на 16 пикселей составляют 256000 пикселей.Даже если использование 4 байтов для каждого пикселя приведет только к одному МБ данных изображения, что немного.

Если вы действительно хотите / хотите уменьшить количество изображений, загружаемых в память, вы можете толькозагрузите в память визуальные плитки / изображения, необходимые для вашей карты, и еще несколько, чтобы повысить отзывчивость вашей игры.

Например, если ваша игра показывает карту размером n на m, вы можетезагрузить плитки n+2 на m+2 в память или визуально представленные (где * видимые плитки и + дополнительные загруженные плитки в память):

+++++++++++
+*********+
+*********+
+*********+
+++++++++++

Когда пользователь перемещает карту, вы удаляетессылки на плитки, которые вам больше не нужны, и начните загружать новые плитки.Поскольку у вас в памяти есть один тайл, перемещение карты должно происходить достаточно плавно.Конечно, если ваши плитки довольно маленькие или перемещение карты происходит довольно быстро, вы можете увеличить количество используемых вами плиток

1 голос
/ 30 декабря 2011

Вы пробовали?если у вас есть 4 байта на пиксель, 16 x 16 x 4 x 1000 составляет около 1 МБ + накладные расходы.Это уже не так много.Если вы не можете себе этого позволить, то, возможно, создайте увеличенные изображения, загрузите их и извлеките плитки по мере необходимости.

0 голосов
/ 29 декабря 2011

Я не думаю, что буферизация 1000+ изображений является лучшим вариантом, потому что он занимает много памяти.Может быть, лучше реализовать другую логику, такую ​​как буфер только для наиболее часто используемых изображений, таких как 100 или около того (просто используется случайное число, но вам необходимо выяснить, сколько будет часто используемых изображений), если любое изображение, кроме этих, кэшируется, загружайте их при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...