Как я могу изящно снизить производительность, учитывая ограниченную память? - PullRequest
4 голосов
/ 03 апреля 2012

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

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

  1. 2 действия, 13 файлов XML (некоторые относятся к небольшой части макета, некоторые диалоговые окна и 2 напрямую связаны с действиями.
  2. Количество рисунков, выполненных в 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 Мб актуальным требованием для разработки до (1.6+ android)?
  2. Предполагая, что так и есть, как я могу разрешить более качественную графику для систем, которые могут с ней справиться, но без сбоев и сбоев для старых систем?
  3. Какие распространенные ошибки можно использовать для улучшения использования памяти?

1 Ответ

3 голосов
/ 03 апреля 2012

Не видя вашего фактического кода, я не могу сказать, будет ли для вас актуальным следующее или нет. Тем не менее, стоит попробовать.

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

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

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

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

И, наконец, этот пост от SO также должен помочь при работе с размером кучи: Определение размера кучи приложения в Android

Надеюсь, это поможет.

...