Программирование игр для Android — проблемы с кучей

Я работаю в небольшой компании по разработке игр для Android, и в настоящее время у меня возникла проблема. У меня довольно стандартная машина с Windows 7 x64, Eclipse и Android SDK.

Я читал вывод LogCat для своей программы и удивлялся, почему моя игра вообще не отображается. Я быстро увидел, что вся куча растет, и подумал, что, возможно, у меня слишком много текстур/слишком большие текстуры и т. д. Я определил проблему с загрузкой текстур, затем начал использовать DDMS и заметил, что моя куча не будет расти выше 19 МБ. Я вырезал пару текстур и попытался собрать и запустить снова. К моему удивлению, куча постоянно не превышала 6,6 МБ. У кого-нибудь есть предложения?

tl;dr: Моя куча увеличилась до 19 МБ, а затем перестала работать, поэтому я убрал текстуры, требующие больше памяти, чтобы размер кучи не превышал 19 МБ, и теперь моя куча не будет увеличиваться больше 6,6 МБ. сильный>

РЕДАКТИРОВАТЬ: вывод logcat при удалении больших текстур:

08-19 19:19:53.744: DEBUG/dalvikvm(4699): GC_FOR_MALLOC freed 91 objects / 514016 bytes in 49ms
08-19 19:19:54.184: DEBUG/dalvikvm(4699): GC_FOR_MALLOC freed 104 objects / 494088 bytes in 48ms
08-19 19:19:54.404: WARN/ActivityManager(59): Launch timeout has expired, giving up wake lock!
08-19 19:19:54.764: DEBUG/dalvikvm(4699): GC_FOR_MALLOC freed 85 objects / 384664 bytes in 49ms
08-19 19:19:54.935: WARN/ActivityManager(59): Activity idle timeout for HistoryRecord{4612eec8 com.wickeyware.zombiearcher.android/.AndroidGame}
08-19 19:19:55.234: DEBUG/dalvikvm(4699): GC_FOR_MALLOC freed 104 objects / 504648 bytes in 47ms
08-19 19:19:55.875: DEBUG/dalvikvm(4699): GC_FOR_MALLOC freed 85 objects / 505712 bytes in 55ms
08-19 19:19:56.905: DEBUG/dalvikvm(4699): GC_FOR_MALLOC freed 104 objects / 522392 bytes in 50ms
08-19 19:19:57.535: DEBUG/dalvikvm(4699): GC_FOR_MALLOC freed 56 objects / 388896 bytes in 50ms
08-19 19:19:57.695: INFO/WindowManager(59): WIN DEATH: Window{4606a8a0 com.android.launcher/com.android.launcher2.Launcher paused=false}
08-19 19:19:57.705: INFO/ActivityManager(59): Process com.android.launcher (pid 4669) has died.
08-19 19:19:57.825: INFO/ActivityManager(59): Low Memory: No more background processes.
08-19 19:19:57.865: INFO/dalvikvm(4699): dvmDdmHandleHpsgChunk(when 1, what 0, heap 0)
08-19 19:19:58.575: DEBUG/ddm-heap(4699): Heap GC request
08-19 19:19:58.685: DEBUG/dalvikvm(4699): GC_EXPLICIT freed 48 objects / 313440 bytes in 106ms
08-19 19:20:01.015: INFO/ActivityManager(59): Process jp.co.omronsoft.openwnn (pid 4677) has died.
08-19 19:20:01.095: WARN/ActivityManager(59): Scheduling restart of crashed service jp.co.omronsoft.openwnn/.OpenWnnJAJP in 5000ms
08-19 19:20:01.106: INFO/ActivityManager(59): Low Memory: No more background processes.
08-19 19:20:03.105: INFO/ActivityManager(59): Process com.wickeyware.zombiearcher.android (pid 4699) has died.
08-19 19:20:03.155: INFO/WindowManager(59): WIN DEATH: Window{46138b68 SurfaceView paused=false}
08-19 19:20:03.275: INFO/WindowManager(59): WIN DEATH: Window{4612d530 com.wickeyware.zombiearcher.android/com.wickeyware.zombiearcher.android.AndroidGame paused=false}
08-19 19:20:03.425: INFO/ActivityManager(59): Start proc com.android.launcher for activity com.android.launcher/com.android.launcher2.Launcher: pid=4710 uid=10025 gids={}
08-19 19:20:03.425: INFO/ActivityManager(59): Low Memory: No more background processes.
08-19 19:20:03.775: INFO/UsageStats(59): Unexpected resume of com.android.launcher while already resumed in com.wickeyware.zombiearcher.android
08-19 19:20:03.904: INFO/ActivityThread(4710): Publishing provider com.android.launcher2.settings: com.android.launcher2.LauncherProvider
08-19 19:20:04.005: DEBUG/dalvikvm(4710): GC_EXTERNAL_ALLOC freed 985 objects / 73440 bytes in 58ms
08-19 19:20:04.465: WARN/InputManagerService(59): Got RemoteException sending setActive(false) notification to pid 4699 uid 10036
08-19 19:20:04.984: INFO/ActivityManager(59): Displayed activity com.android.launcher/com.android.launcher2.Launcher: 1703 ms (total 20584 ms)
08-19 19:20:06.124: INFO/ActivityManager(59): Start proc jp.co.omronsoft.openwnn for service jp.co.omronsoft.openwnn/.OpenWnnJAJP: pid=4718 uid=10023 gids={}

person Evan    schedule 19.08.2011    source источник
comment
Вы получаете исключения из памяти?   -  person Eugene S    schedule 19.08.2011
comment
Игра запустилась после удаления текстур? Вы хотите придерживаться листа текстуры с максимальным разрешением 1024x1024 для текущего игрового экрана и загружать только один лист текстуры за раз, чтобы избежать проблем с кучей.   -  person Chris    schedule 19.08.2011
comment
я загружаю 1 лист текстуры за раз, и я не получаю исключение нехватки памяти. другие программы просто останавливаются, как и моя, затем jp.co.omronsoft.openwnn сбрасывается примерно через 500 мс после смерти моей программы. игра не запустилась, когда я удалил текстуры, вот в чем проблема.   -  person Evan    schedule 19.08.2011
comment
привет, см. эту ссылку ниже, полная справка в вашем приложении [stackoverflow.com/questions/171205/ [1]: stackoverflow.com/questions/171205/   -  person Narasimha    schedule 07.02.2012
comment
@narasimha Я не думаю, что это относится к dalvik.   -  person Steve Blackwell    schedule 09.02.2012
comment
Я считаю, что многие устройства Android имеют размер кучи по умолчанию 16 МБ, а некоторые — 24 или 32 МБ. Возможно, вы можете попробовать это в эмуляторе и установить кучу вручную (свойства) и посмотреть, будет ли это иметь значение.   -  person user717572    schedule 22.02.2012


Ответы (2)


GC_FOR_MALLOC freed 104 objects / 504648 bytes in 47ms

Это сборщик мусора стреляет. К сожалению, без какого-либо источника никто здесь не сможет вам помочь.

Но похоже, что вы создаете слишком много объектов, и сборщик мусора почти постоянно срабатывает.

person edthethird    schedule 28.02.2012

Привет. Я не совсем уверен, что мой ответ правильный, но у меня была аналогичная проблема.

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

Например:

// Delete a texture
int[] textures = { textureId };
gl.glDeleteTextures(1, textures, 0);

// Create new texture ...

Or:

int oldTextureId = textureId;
...
// Create new texture
...
// Delete texture
int[] textures = { oldTextureId };
gl.glDeleteTextures(1, textures, 0);
person Taras Feschuk    schedule 27.02.2012