2012-04-03 3 views
4

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

Прежде всего, моя игра состоит из:.

  1. 2 мероприятия, 13 XML-файлов (Некоторые относящихся к небольшой части макета, некоторые диалоговые окна и 2, непосредственно связанных с деятельностью
  2. A количество рисунков, сделанных в Adobe Illustrator и преобразованных в PNG. Вероятно, они большие, но не необычно большие, и по большей части в любой момент времени они хранятся только в небольших объемах.
  3. Довольно много диалогов.
  4. Ориентирован на Android 1.6 и выше.
  5. Я использовал новейший Admob, и в результате мне нужно построить против 3.2.
  6. Мой размер кучи по умолчанию для моих эмуляторов составляет около 24 МБ.

Несколько образцов изображения из моей игры:

enter image description here

enter image description here

enter image description here

То, что я узнал:

  1. Несмотря на мой общий размер приложения составляет всего около 500 тыс., я как-то забираю 24 Мега, как рассчитывается adb shell procrank.
  2. Я сделал значительную оптимизацию, но не вижу больших увеличений в памяти.
  3. Использование инструментов для поиска того, что находится в куче, обычно показывает только около 7 МБ, используя около 3 МБ. Иногда при открытии новых диалогов и т. Д. Я вижу увеличение, но я не могу сказать, что я вижу, что он такой большой ...
  4. MAT показывает, что ни один из моих классов не использует необычно большой объем памяти ,

Итак, учитывая все это, мои вопросы.

  1. Есть ли 24 Mb фактическое требование для разработки (1.6+ android)?
  2. Предполагая, что это так, как я могу обеспечить более удобную графику для систем, которые могут ее обрабатывать, но не сбой и сжигание для старых систем?
  3. Каковы некоторые распространенные ошибки, которые я могу использовать для улучшения использования памяти?

ответ

3

Не видя своего фактического кода, я не могу сказать, будет ли для вас актуальным следующее: Однако это стоит того.

Если вы еще этого не сделали, вы можете использовать что-то, называемое LruCache.http://developer.android.com/reference/android/util/LruCache.html

С помощью этого инструмента вы можете определить, в какой момент ваши кешированные объекты (такие как растровые изображения) станут пригодными для сбора мусора. Итак, если вы хотите установить его на 4 Мб (например), ОС будет заниматься этим, если он попытается вырасти за его пределами. (См. Документы для деталей реализации и хороший пример).

Единственный недостаток заключается в том, что этот маленький жемчуг появился только с 3,2, поэтому вам нужно будет сделать этот мини-SDK в AndroidManifest или выполнить программную проверку во время выполнения для уровня api, чтобы определить, можете ли вы использовать Это. Pre 3.2 Я бы сказал, что вам нужно вызвать recycle() на любые растровые изображения, которые вы используете, но если вы уже оптимизировали, я думаю, что шансы хорошие, вы уже это делаете.

Это хороший небольшой фрагмент о разнице между кучей и собственной памятью. http://code-gotcha.blogspot.com/2011/09/android-bitmap-heap.html Это может (в зависимости от того, что вы делаете) поможет вам понять, почему вы не видите падение памяти, которое вы ожидаете.

И, наконец, этот пост от SO должно помочь при работе с размером кучи, а также: Detect application heap size in Android

Надежда, что помогает.

+1

LruCache также доступен в библиотеке поддержки http://developer.android.com/reference/android/support/v4/util/LruCache.html – dangVarmit

Смежные вопросы