Програмиране на Android игри - проблеми с Heap

Работя за малка компания за разработка на игри за Android и в момента имам проблем. Работя с доста стандартна машина с Windows 7 x64, с Eclipse и Android SDK.

Четох изхода на LogCat за моята програма и се чудех защо играта ми дори не се показва. Бързо видях как цялата купчина расте и си помислих, че може да имам твърде много текстури/твърде големи текстури и т.н. Насочих проблема към зареждането на текстури, след което започнах да използвам DDMS и забелязах, че моята купчина няма да расте над 19 MB. Изрязах няколко текстури и се опитах да създам и стартирам отново. За мой шок, купчината нямаше да нарасне над 6,6 MB постоянно. Някой има ли предложения?

tl;dr: Моят хийп нарастваше до 19MB, след което се провали, така че извадих текстури, които бяха по-скъпи за паметта, за да го запазя под 19MB в хийпа, и сега моят хийп няма да надхвърли 6,6MB.

РЕДАКТИРАНЕ: изход на 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 за текущия екран на играта и да зареждате само 1 текстурен лист наведнъж, за да избегнете проблемите с купчината.   -  person Chris    schedule 19.08.2011
comment
зареждам по 1 текстурен лист наведнъж и не получавам изключение за липса на памет. други програми просто спират, както и моята, след което jp.co.omronsoft.openwnn се нулира около 500 ms след смъртта на моята програма. играта не тръгна, когато премахнах текстурите, това е проблема.   -  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 имат размер на купчината по подразбиране от 16mb, а някои 24 или 32mb. Може би можете да го опитате в емулатор и да зададете купчината ръчно (свойства) и да видите дали това има значение.   -  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