2012-03-31 8 views
6

Estoy desarrollando un juego en android.Me gusta la defensa de la torre. Estoy usando una imagen como mapa de bits. (Spritesheets, tilesets, botones, fondos, efectos frente a) Ahora las imágenes son casi 5-6 mb.Y obtengo este error cuando ejecuto mi juego:El tamaño del mapa de bits excede el presupuesto de la VM cuando se desarrolla el juego

tamaño de mapa de bits supera el presupuesto VM

19.464.192 bytes asignación externa demasiado grande para este proceso.

me llaman imágenes como que

BitmapFactory.decodeResource(res, id) 

y lo ponen a la matriz. No puedo escalar imágenes. Estoy usando todas. He intentado que

options.inPurgeable=true; 

y que funcione, pero la imagen se está cargando carga muy slowly.I un spritesheet con eso y cuando se está cargando, me pongo muy muy bajo fps.

¿Qué puedo hacer?

Respuesta

0

No soy un desarrollador de juegos, pero me gustaría pensar que sé lo suficiente de Android.

Cargando imágenes del tamaño es casi seguro que arrojen errores. ¿Por qué las imágenes tienen el tamaño de archivo?

Hay un ejemplo en http://p-xr.com/android-tutorial-how-to-paint-animate-loop-and-remove-a-sprite/. Si notas que tiene un sprite de explosión de solo ~ 200Kb. Incluso una imagen más detallada no requeriría mucho más espacio de archivos.

OK algunas sugerencias:

  • ¿Está cargando todos sus spritesheets en una sola hoja o es cada spritesheet en un archivo separado? Si están todos en uno, los separaría .

  • reducir la resolución de las imágenes, un dispositivo Android es portátil y algunos sólo tienen una pantalla de baja resolución. Por ejemplo, el HTC Wildfire tiene una resolución de 240x320 (dispositivo LDPI) y es bastante un dispositivo común . No ha indicado las dimensiones de la imagen, por lo que no podemos estar seguros si esto es práctico.

Finalmente; No soy un programador de juegos pero encontré este tutorial (parte de la misma serie) bastante esclarecedor: http://p-xr.com/android-tutorial-2d-canvas-graphics/. Me pregunto si está aplicando un patrón que no es apropiado para Android, sin embargo, no puedo decir el código.

algo bien un poco fuera de tema, pero vale la pena destacar ...

Las personas menores de estimar la potencia de la Vista. Si bien hay una cierta cantidad de lógica para usar un SurfaceView, la vista estándar hará mucho por sí misma. Un SurfaceView más de las veces requiere un hilo subyacente para ejecutar (que tendrá que configurar usted mismo) para que funcione.Una visión requiere, sin embargo onDraw(), que puede ser utilizado en una variedad de maneras, incluyendo el método postinvalidate() (ver What does postInvalidate() do?).

En cualquier caso podría ser vale la pena ver este tutorial http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/. Personalmente, fue un excelente ejemplo de una vista personalizada y lo que puede hacer con ellas. Reescribí algunas secciones e hice una aplicación de reloj de bolsillo.

+0

I Thankfull por su ayuda, pero no puedo resolver. Uso una gran hoja de sprites porque hay demasiada animación. Por ejemplo, esta es la hoja de sprites de una criatura de mi juego: http://nafiz.in/bigeye.png Uso galaxy s y estoy usando este spritesheets de tamaño completo. Primero debo trabajarlo en mi dispositivo. Probablemente, no hay límite 7-8 mb para la investigación bitmap.I nuevo y lo encontró para resolver este problema que debo usar JNI o ​​opengl.But ese punto, no puedo usar otra them.Maybe project.So quitaré algo de animación y trabajo en la administración de heap. –

2

que he tenido este problema también; en realidad no hay otra solución que no sea reducir el número/tamaño de mapas de bits que ha cargado a la vez. Algunos dispositivos Android anteriores solo asignan 16 MB al montón para toda su aplicación, y los mapas de bits se almacenan en la memoria sin comprimir una vez que los carga, por lo que no es difícil exceder los 16 MB con fondos grandes, etc. (Se trata de un mapa de bits de 854x480 y 32 bits). 1.6MB descomprimido)

En mi juego pude sortearlo cargando solo mapas de bits que iba a usar en el nivel actual (por ejemplo, tengo un único objeto Bitmap para el fondo que se recarga desde recursos cada el tiempo cambia, en lugar de mantener múltiples mapas de bits en la memoria. Solo mantengo un int que rastrea qué recurso he cargado actualmente.)

Su hoja de sprites es enorme, así que creo que tiene razón en que necesitará reduce el tamaño de tus animaciones Alternativamente, la carga de recursos es decentemente rápida, por lo que puede salirse con la suya haciendo solo cargar la tira de animación para la dirección actual del personaje, y hacer que se detenga ligeramente cuando gira mientras la reemplaza con la nueva tira de animación. Aunque eso podría complicarse.

Además, le recomiendo probar la aplicación en el emulador con un montón VM se establece en 16 MB, para asegurarse de que haya solucionado el problema para todos los dispositivos. (Por lo general el emulador por defecto es de 24 MB, por lo que es fácil para que para ir sin probar y generar algunos comentarios de 1 estrella después de la liberación.)

Cuestiones relacionadas