Программирование игр для Android - проблемы с кучей - PullRequest
8 голосов
/ 19 августа 2011

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

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

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={}

Ответы [ 2 ]

1 голос
/ 28 февраля 2012
GC_FOR_MALLOC freed 104 objects / 504648 bytes in 47ms

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

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

0 голосов
/ 28 февраля 2012

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

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

Например:

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

// Create new texture ...

Или:

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