Библиотека для неограниченной памяти кучи для растровых изображений с использованием NDK на Android

По дизайну приложения Android очень ограничены в объеме кучи памяти, которую они могут использовать. Ограничение для приложений SDK составляет всего лишь 16 МБ на старых устройствах. Такой дизайн обычно имеет смысл, поскольку ОС пытается поддерживать многозадачность на устройствах, которые обычно очень малы в памяти, поэтому каждая задача получает свой собственный небольшой рацион.

Ограничение памяти зависит от устройства. Например, Samsung Galaxy S2, каждое приложение получает где-то между 32 МБ-64 МБ. Это устройство имеет 1 ГБ оперативной памяти, поэтому одна задача может использовать только около 5% того, что может предложить устройство.

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

Давайте сделаем это в стороне – это не дискуссия о том, какая стратегия памяти лучше.

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

Когда оптимизации ресурсов недостаточно, стандартная стратегия преодоления ограничения памяти использует NDK . «Нативная» куча в Android не имеет искусственных ограничений и ведет себя так же, как куча на iOS. Использование «родной» кучи для хранения растровых изображений работает хорошо – на самом деле, как растровые изображения были сохранены на Android 2.3.3 и ниже (JVM все же ограничивала их искусственно, хотя).

Я ищу библиотеку NDK + JNI для хранения неограниченных растровых изображений в «родной» куче. Его интерфейс Java должен быть идентичен API-интерфейсу bitmap. Я не знаю какого-либо публичного проекта для этой цели и буду признателен за вашу помощь в его поиске. Если вы внедрили это и хотите поделиться своим кодом, он также будет оценен.

Заключительный комментарий: Пожалуйста, не делайте это обсуждением морали наличия такой библиотеки для широкой публики.

Ограничение кучи на последних устройствах емкостью 2 ГБ составляет около 192 МБ. Приложения, которым требуется большой объем памяти, например редакторы изображений, могут включать android:largeHeap=true в манифесте приложения, чтобы увеличить его до более высокого предела (в настоящее время около 512 МБ).

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

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

Сказав все это, я думаю, вы ищете это .