Intereting Posts
Пользовательский стиль кнопки расширителя ExpandableListView Как получить прокручиваемый ListView? Бесконечный цикл активности при переключении Bluetooth GlTexSubImage2D работает медленнее с пиксельными буферами Как конвертировать android.net.Uri в java.net.URL? Отслеживать родительский класс из образа элемента Как создать два представления в Android, которые используют 50% высоты каждый, если только он меньше? Общение с последовательным USB-устройством через Android Альтернативный входной сигнал Firemonkey TWebBrowser? Встроенный компилятор Android Studio показывает красные ошибки, но компиляция с градием отлично работает Сериализация v / s Parcellable android UnitTest JSONObject показывает значение null Google Map Api v2 показывает, что класс дескриптора локального модуля не найден Parse: Сообщения с указанием входа в систему пользователя понравилось или нет Как воссоздать файл хранилища ключей, если он случайно удалился

Android: потребление игровой памяти LibGDX 2D

Я сталкиваюсь с некоторыми проблемами с потреблением памяти при разработке 2D-игры с использованием libGDX.

Это 2D-игра с богатым графическим контентом – есть много текстур, анимаций, шрифтов и т. Д. По некоторым причинам весь графический контент загружается в начале игры – и вот проблема с памятью. Я проверил распределение памяти (native & heap) на разных устройствах и получил разные результаты: (я разделил все устройства на группы по размерам текстур)

Группа 1 (текстуры, принятые для экранов ~ 840 * 480)

HTC Desire (Froyo): 178Mb (родной) – 12Mb (куча) – приложение загружается успешно

HTC One V (ICS): 30 Мб (родной) – 12 Мб (куча) – приложение загружается успешно

HTC Desire S (Jelly Bean): 30 МБ (родной) – 12 Мб (куча) – приложение загружается успешно

Группа 2 (текстуры, принятые для ~ 1366 * 768 экранов)

Samsung (Google) Galaxy Nexus 329Mb (родной) – 18 Мб (куча) – отлично работает

Galaxy TAB (Honeycomb) 164Mb (родной) – 10 Мб (куча) – сбои приложений (Surface.OutOfResouresException).

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

Может ли кто-нибудь объяснить, что именно происходит при загрузке текстур на Android 3.x? Или, может быть, разместите некоторые ссылки, чтобы понять, что нужно сделать для решения этой проблемы.

НЕКОТОРЫЕ ОБНОВЛЕНИЯ

Toady, я сделал несколько дополнительных тестов на эмуляторах 3.x (я знаю, что это не лучший способ, но журналы были похожи на эму и Galaxy Tab раньше)

  1. Я запускал игру с текстурами, принятыми для 1024 * 600 – сбой приложений на 80% загружаемых ресурсах (158 собственных распределений памяти)
  2. С текстурами для 800 * 480 – сбой приложений при 100% -ной загрузке (145 Мб встроенной памяти)

И, наконец, я запустил приложение на новом планшете Google Nexus (Jelly Bean), который использует те же текстуры, что и 3.x-планшеты (1280 * 800 пикселей) – ~ 30 Мб встроенной памяти и ~ 12Mb vm heap.

Теперь я полностью теряю понимание того, что происходит – такое же распределение памяти для текстур 800 * 480 и 1280 * 800 …

В КОНЦЕ КОНЦОВ

Я решил эту ситуацию, используя ресурсы загрузки по требованию с некоторым индикатором выполнения. После всех попыток я не нашел другого пути.

Если вам интересно, почему Android 3 рушится более чем на 2.X, это из-за ошибки ByteBuffer. ByteBuffer использует в 4 раза больше памяти. Таким образом, вы должны использовать изображения с более низким разрешением для Android 3. Это было решено в Android 4.

http://code.google.com/p/android/issues/detail?id=16941

Lucky for Android 3+ у вас есть опция большой кучи (дает около 128 мегабайт), что я и должен был включить для нашего приложения.

Я считаю, что использование памяти растрового изображения во время работы может раздуваться, если формат растрового изображения не соответствует формату отображения (система в конечном итоге создаст копию с правильным форматом для blit). Я думаю, что это больше проблема для старых систем Android, и, вероятно, это не то, что вы видите на 3.0, но, возможно, стоит заглянуть в нее. (См. Бит производительности в конце поста Romain здесь )

Учет памяти для байт-массивов, основанных на растровых изображениях, изменился в 3.0 (Honeycomb), память переместилась с родной стороны в кучу Java. Однако это просто сдвинуло память вокруг и не должно влиять на фактические пределы (внутренняя память по-прежнему учитывалась с одним и тем же пределом, она просто не была видна некоторым инструментам).

Предел кучи различен на разных устройствах. (См. Размер кучи Android на разных телефонах / устройствах и версиях ОС )

Этот диалог ввода-вывода Google охватывает множество проблем, связанных с изменениями в управлении памятью в версии 3.0, которые могут быть полезны: http://dubroy.com/blog/google-io-memory-management-for-android-apps/

Вы можете загрузить уменьшенную версию ваших растровых изображений на устройствах с более низкой памятью. Его, вероятно, стоит прочитать через остальную часть http://developer.android.com/training/displaying-bitmaps/index.html .

Сколько данных на диске есть у вашего приложения? Насколько велики другие данные без изображения, которые вы загружаете (шрифты, анимации и т. Д.)?