В проекте, над которым я работаю, используется несколько фонов «высокого разрешения» (обратите внимание на цитаты). Чтобы понять ситуацию, один из них - файл PNG размером 640x935 1,19M. Насколько мне известно, даже если Android распаковывает изображения в память как необработанные данные, это должно быть:
640 x 935 x 4 байта = 2,39 МБ
У меня проблемы с памятью в моем проекте, которые я не могу понять, и я надеюсь, что кто-то сможет пролить свет на этот вопрос. Я назову два устройства, над которыми я работаю, и некоторые результаты.
Чтобы убедиться, что это не вторичная проблема, я сделал действие, которое не загружало фон при первом создании, а затем, когда пользователь нажимает кнопку, все, что он делает, это:
findViewById(R.id.completed_block_background).setBackgroundResource(R.drawable.blockbackgroundbottom1);
Затем, используя DDMS с «Update Heap» в процессе (и сначала заставляя GC убедиться, что это не будет проблемой), я получаю следующие результаты памяти:
Nexus S: увеличение с 18 до 26 млн (разница 8 млн)
Galaxy Nexus: увеличение с 28 до 39 млн (разница в 11 млн)
Итак, как вы можете видеть, размещение этого теоретически 2,39 МБ несжатого изображения в фоновом режиме фактически увеличивает использование памяти на 8 и 11 МБ. Может кто-нибудь объяснить, почему это так и есть ли решение?
Единственное решение, которое мне удалось найти, - это использование растровых изображений для уменьшения вдвое разрешения или уменьшения формата канала (до сих пор это то, что я сделал, переключил их на 565 RGB, но это создает некоторые проблемы с полосами, которые я не могу принять).
Я бы также согласился с объяснением того, почему это происходит, на случай, если ничего нельзя поделать. Заранее спасибо.
R.id.completed_block_background
точно 640x935? - person CommonsWare   schedule 29.10.2012R.id.completed_block_background
точно 640x935? - person CommonsWare   schedule 29.10.2012