Почему андроид ограничивает объем памяти vm произвольными 24 или 32 МБ?

1

Я создал игру сверху вниз, в которой ваш персонаж перемещается по уровню. Уровень - это, по сути, 1600x2400 png. Я не могу загрузить этот png в память, поэтому мне нужно использовать BitmapRegionDecoder, чтобы загрузить его в куски, когда игрок перемещается по уровню. Конечно, это отстой и, возможно, приводит к заиканию. Я думал о загрузке следующего фрагмента в фоновом потоке, но это означало, что у меня было два куска в памяти: текущий и следующий, что привело бы к исключению OutOfMemoryException.

Теперь у всех устройств есть как минимум 512 МБ или ОЗУ, так почему у нас все еще есть этот глупый лимит на vm ram? Это деспотичный Google, чтобы рассказать нам, сколько бара мы должны использовать! Давайте решать! Теперь я должен есть намного больше циклов процессора только потому, что не могу загрузить все это в ОЗУ, не говоря уже о худшей производительности, которую я получаю с этим BitmapRegionDecoder!

Любые идеи, почему Google делает это и когда это закончится? Каков логический аргумент в пользу этого решения?

Теги:
memory-management

1 ответ

2

a) ОЗУ 512 МБ не означает, что ваше приложение может использовать это. Свободная память по-прежнему довольно ограничена. Поэтому я думаю, что это никогда не закончится. Количество, которое получит VM, вероятно, увеличится, но если вы хотите оставаться совместимым, тогда вам нужно эффективно кодировать код. (например, разделить изображения и не загружать данные с гигантского изображения)

b) Вы можете использовать JNI/NDK/C и управлять памятью самостоятельно, нет ограничений для собственного кода.

  • 0
    Я думаю, что идея разделения изображений не так уж и хороша. Это связано с разным разрешением экрана разных устройств. Я почти уверен, что автор пытается сделать игру похожей на разных устройствах, что означает, что если устройство имеет большее разрешение экрана, чем пользователь, то увидит больше вместо растянутого и размытого маленького кусочка. Таким образом, это реальная область декодирования дилеммы, и ее можно извлечь из памяти или разделить на части, а в некоторых случаях получить продукт низкого качества. И ограничение памяти этой AOS VM действительно отстой, особенно в наши дни!
  • 0
    Разделение изображений на плитки - хорошая идея, если у вас есть произвольно большие изображения, например, карты Google. Очевидно, вам нужно сделать намного больше, чтобы отобразить его, как если бы это было одно изображение, но вы получаете полную независимость от размера изображения. И вы можете видеть из этого примера, что у вас нет размытых изображений, если вы делаете это правильно. Это не так просто, как загрузка одного изображения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню