Размер растрового изображения превышает бюджет виртуальной машины при разработке игры - PullRequest
6 голосов
/ 01 апреля 2012

Я занимаюсь разработкой игры на android. Как защита башни.Я использую вид поверхности. Я использую некоторые изображения в качестве растрового изображения (таблицы спрайтов, наборы плиток, кнопки, фоны, эффекты и т. Д.). Теперь изображения имеют размер около 5-6 МБ. И я получаю эту ошибку при запуске игры:

Размер растрового изображения превышает бюджет виртуальной машины

19464192-байтовое внешнее выделение слишком велико для этого процесса.

Я называю такие изображения

BitmapFactory.decodeResource(res, id)

и я положил его в массив.Я не могу масштабировать изображения. Я использую их все.Я попробовал это

options.inPurgeable=true;  

, и это работает, но изображение загружается очень медленно. Я загружаю spritesheet с этим, и когда он загружается, я получаю очень очень низкий fps.

Что можетЯ делаю?

Ответы [ 2 ]

2 голосов
/ 07 июля 2012

У меня тоже была эта проблема; на самом деле нет другого решения, кроме как уменьшить количество / размер растровых изображений, которые вы загрузили за один раз. Некоторые старые устройства Android выделяют кучу только 16 МБ для всего вашего приложения, и растровые изображения сохраняются в памяти без сжатия после загрузки, поэтому не сложно превысить 16 МБ с большими фонами и т. Д. 1.6MB без сжатия.)

В моей игре мне удавалось обойти это, загружая только растровые изображения, которые я собирался использовать на текущем уровне (например, у меня есть один растровый объект для фона, который перезагружается из ресурсов при каждом изменении, а не поддержание нескольких битовых карт в памяти. Я просто поддерживаю int, который отслеживает, какой ресурс я загрузил в настоящее время.)

Ваш спрайт-лист огромен, поэтому я думаю, что вы правы, что вам нужно уменьшить размер анимации. В качестве альтернативы, загрузка из ресурсов довольно быстрая, так что вам, возможно, удастся сделать что-то вроде загрузки полосы анимации для текущего направления персонажа, и заставить его немного остановиться, когда он поворачивается, пока вы заменяете его новой полосой анимации. Это может быть сложно, хотя.

Кроме того, я настоятельно рекомендую протестировать ваше приложение на эмуляторе с кучей виртуальных машин, установленной на 16 МБ, чтобы убедиться, что вы устранили проблему для всех устройств. (По умолчанию эмулятор по умолчанию равен 24 МБ, поэтому его легко пройти без проверки и создать после проверки несколько звездных отзывов.)

0 голосов
/ 01 апреля 2012

Я не разработчик игр, но мне хотелось бы думать, что я достаточно знаю Android.

Загрузка изображений такого размера почти наверняка приведет к ошибкам. Почему изображения имеют размер файла?

Есть пример на http://p -xr.com / android-tutorial-how-to-to-paint-animate-loop-and-remove-a-sprite / . Если вы заметите, что у него спрайт взрыва всего ~ 200Кб. Даже более детальное изображение не займет намного больше места в файле.

ОК, некоторые предложения:

  • Загружаете ли вы все ваши спрайт-листы на один лист или каждый spritesheet в отдельном файле? Если бы они все были на одном, я бы разделить их.

  • Уменьшите разрешение изображений, устройство Android является портативным и некоторые имеют только экран с низким разрешением. Например, HTC Wildfire имеет разрешение 240х320 (устройство LDPI) и является довольно общее устройство. Вы не указали размеры изображения, поэтому мы не можем быть уверены, что это целесообразно.

Наконец; Я не программист, но этот урок (часть той же серии) показался мне очень полезным - http://p -xr.com / android-tutorial-2d-canvas-graphics / . Интересно, вы применяете шаблон, который не подходит для Android, однако без кода я не могу сказать.

Правильно, немного не по теме, но стоит отметить ...

Люди недооценивают силу Видения. Несмотря на то, что в использовании SurfaceView есть определенная логика, стандартный View сам по себе многое сделает. Поверхностный вид чаще всего требует запуска основного потока (который вам нужно будет настроить самостоятельно), чтобы он работал. Однако View вызывает onDraw (), который можно использовать различными способами, включая метод postinvalidate() (см. Что делает postInvalidate ()? ).

В любом случае, возможно, стоит проверить этот урок http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/. Лично это был отличный пример пользовательского представления и того, что вы можете с ним сделать. Я переписал несколько разделов и сделал приложение для карманных часов.

...