2011-08-05 4 views
1

Mon jeu utilise surfaceview (je sais que je devrais utiliser GL). Je dessine beaucoup de bitmaps sur mon contrôleur de personnage de jeu, etc. Et je cours dans ce quand j'ai ouvert mon LogDog:Développement Android: Bitmaps sur la fuite de surface de la mémoire Mémoire ou trop grand?

08-05 10:17:29.151: ERROR/dalvikvm(24048): Out of memory: Heap Size=5379KB, Allocated=2735KB, Bitmap Size=20576KB, Limit=32768KB 

Je ne sais pas si c'est fuite ou quoi.

Mon Tracker Allocation montre:

comme 30:

138 96 char[] 9 android.content.res.AssetManager getCookieName 

Puis tonnes de:

32 80 android.graphics.BitmapFactory$Options 9 android.graphics.BitmapFactory decodeResource 

et dernier: Comme 30:

141 56 android.graphics.Bitmap 9 android.graphics.BitmapFactory nativeDecodeAsset 

Et aussi un peu plus de ceux qui sont simulaires.

Voici un code que je pense que draine ma mémoire:

player = BitmapFactory.decodeResource(getResources(), R.raw.ghostright); 
     world = BitmapFactory.decodeResource(getResources(), R.raw.lvl2); 
     thumb = BitmapFactory.decodeResource(getResources(), R.raw.thumb); 

resized = Bitmap.createScaledBitmap(player, width/10, width/6, false); 
     player = resized; 


     resized = Bitmap.createScaledBitmap(world, height*10, height, false); 
     world = resized; 


     resized = Bitmap.createScaledBitmap(thumb, height/6, height/6, false); 
     thumb = resized; 

J'ai appris que je devrais utiliser resycle mais je ne sais pas où parce que je l'utilise toujours les bitmaps

// Simon PS: J'ai vraiment besoin d'aide -.-

Répondre

1

J'utilise aussi beaucoup de bitmaps sur SurfaceView et je n'ai pas ce problème. En ce qui concerne les sprites animés, vous pouvez utiliser une feuille de sprite plutôt que de les charger individuellement image par image.

Vous n'avez pas besoin d'utiliser la référence "redimensionnée" vous pouvez simplement dire:

joueur = Bitmap.createScaledBitmap (joueur, largeur/10, largeur/6, vrai);

l'ancien bitmap perdra sa référence et sera collecté par GC. Notez que j'ai placé TRUE pour le filtrage bitmap lors de la mise à l'échelle pour améliorer la qualité.

Sur certains appareils, onSizeChanged peut arriver deux fois, ce qui peut redimensionner des bitmaps deux fois, si c'est là que vous effectuez votre mise à l'échelle. Le format des bitmaps chargés metter si c'est ARGB_4444 ou ARGB_8888 etc Donc vous devrez peut-être explorer cette option et si vous pouvez utiliser un format qui nécessite moins de mémoire mais il a une assez bonne qualité pour votre jeu. Bien sûr, la règle n'est pas de charger des images dans la mémoire plus grandes que nécessaire et quand elles sont nécessaires.

1

Il ne doit pas être une fuite de mémoire, il se peut que vous ayez des bitmaps si grandes qu'ils veulent allouer à beaucoup de mémoire. Voici une bonne méthode pour déterminer la quantité de mémoire qu'un bitmap va prendre: W * H * 8. Donc si vous avez un bitmap de 300 * 300 px c'est 300 * 300 * 8 = 720 kb.

Déterminez la quantité allouée que vous avez à un moment donné et voyez si elle augmente avec le temps, même si vous savez que vous n'allouez pas de nouveaux bitmaps. Si oui, alors oui, vous avez une fuite de mémoire. Si, toutefois, votre application tombe en panne au démarrage, vous dépasserez probablement la limite du tas.

Questions connexes