Carga inicial muy lenta en Android

Previous topic - Next topic

msx

Hola a todos, necesito que me digáis si vosotros tenéis el mismo problema que yo en Android. Resulta que al iniciar mi aplicación (que no juego ;)) me aparecen unos puntitos como dando entender que está cargando y se lleva un rato muy grande, alrededor de 80 segundos. Ésto solo ocurre la primera vez, pero es un problema gordo porque la gente piensa que no funciona y lo borra. ¿Hay alguna forma de evitar ésto o de poner un mensaje diciendo que se está instalando la aplicación?

Gracias a todos

hardyx

#1
En Android me tarda como 8 segundos en arrancar mi juego, no es normal que te tarde tanto. ¿No estarás cargando muchas cosas al inicio del programa? Y los puntos no me salen tampoco, no uso la beta sino la versión 10.283. Es un poco raro lo que te pasa. ¿Ocupa muchos megas tu aplicación?

msx

Que tal, pues mira la verdad es que solo me lo hace al arrancar la primera vez. Uso la última beta que ha salido y he intentado mostrar una imagen inicial antes de cargar todo el grueso para probar si era eso y nada. Ocupará unos 40 MB porque lleva mucha imagen pero no va en memoria sino que carga conforme hace falta.

Lo de los puntitos ahora que lo dices creo que en la v10 no lo hacia. Trataré de hacerlo desde ahí para ver si mejora.

msx

Bueno, ya tengo más información sobre mi caso.

Lo primero es que mi aplicación ocupa 8 Mb y no 40 Mb como dije antes, craso error por mi parte por contestar sin comprobarlo antes.

Después decir que creo que ya sé cual es el problema. Resulta que tengo 635 archivos de imágenes que aunque ocupan muy poco, creo que es lo que provoca que tarde tanto en arrancar la rimera vez. Parece como si hiciera un preprocesado de las imágenes la primera vez que se inicia y claro, al haber tantos archivos se lleva como 80 segundos para iniciar la primera vez. Las sucesivas veces el arranque es bastante rápido.

¿Habría alguna forma de optimizar el arranque?, ¿sabéis algo al respecto?.

erico

Hi msx. It seems the first install is a process that can take some time for whatever andrioi stuff apk you or anyone may have. The 3 dots loading is there for that reason. Normal stuff. Maybe we can have personal first loading screen? :)

mentalthink

Pues Msx (rebienvenido hombre  =D =D =D, estás por ahí agazapaó).

A mi se me ocurren un par de ideas chaperas... Lo primero si no bajas del tiempo y dices que son 80 segundos, ponle un reloj que se vea como baja el tiempo a medida que cargas

O por ejemplo como tengo yo una barra de carga...

En realidad es sencillo y coñazo, te haces una funcion con un INC variable,1 un rectangulo o lo que queires y un showscreen(), y en cada loadsprite , pones despues o antes del loadsprite o load anim... Yo lo tengo asi y me va de lujo porque a veces me tarda 20 segundos o más depende lo que cargué.

También si no es mucho follón en vez de cargar todo a la vez, haz que carguén un numero de imagenes, y cuando cargués por ejemplo la primera pantalla puesa cagas los que te faltan, al menos de esté modo no está intranquilo el cliente porque ya está dentro de la aplicación...

COmo ves no es que sean muy técnicas pero si te pueden servir, mejor que mejor.

PS: Aunque es una gilipollez que lo diga, ya que tu eres programador profesional, vigila a ver si has cargado algo con bucles, o tienes alguna cosilla mal, aunque 635 archivos los veo demasiado, (no podrías meterlos en Atlas o en sprites en dónde tengas más imagenes de golpe.?¿)

Saludos , me alegro de verte por aqui. :good:

msx

#6
Hola a ambos y gracias por contestarme.

@erico No me refiero a que tome tiempo en instalarse puesto que eso es algo normal y además está gestionado todo por Android, por lo que no hay problema de que el usuario se desespere.
Lo que a mí me ocurre es que una vez instalado el APK, cuando el usuario carga la aplicación por primera vez, aparecen los puntitos durante 80 segundos, lo cual puede dar a entender que se ha colgado.
Debería poder cambiarse los puntitos por un mensaje personalizado que diga algo como "Este proceso tardará unos minutos la primera vez, por favor espere..." o algo parecido para que el usuario esté avisado y no se ponga nervioso, la mayoría creo que lo desinstalan pensando que no funciona.
Quizás Gernot nos pueda orientar sobre como personalizar la pantalla inicial.

@mentalthink
Amigo Iván, sigo por aquí, entro y leo tus post (bueno y los demás, erico, hardyx, Hark0, etc...), aunque a veces no los conteste por las prisas. Lo primero decirte que ni soy programador profesional ni lo pretendendo ser, solo soy aficionado y autodidacta, con lo que todo lo que pueda aprender de vosotros será bienvenido.

Lo segundo explicarte un poco mi problema que quizás no lo he expuesto bien del todo.
Resulta que al instalar el APK en el dispositivo Android y arrancarlo por primera vez, aparecen unos puntitos en medio de la pantalla, que Gernot colocó ahí en la v11 para que se viera que está haciendo algo y no una pantalla negra conmo ocurría en la v10, y se lleva ahí procesando sobre 80 segundos. Esto solo ocurre la primera vez, puesto que las demás veces que arranques la aplicación tarda sobre 5 segundos lo cual me da a pensar que puede ser que la primera vez haga algún tipo de procesamiento supongo que de las imágenes.

Hice la siguiente prueba, mi aplicación como expliqué antes, dispone de unas 635 imágenes, la mayoría de unos pocos Kb. Lo que hice es quitar la carpeta de imágenes para ver si era problema de código y volví a testear la aplicación en mi Android, con lo que conseguí que se ejecutara en 3-4 segundos. De esta forma pude deducir que la primera vez coge las imágenes y hace algo con ellas que en las demás veces no hace, con lo que pasa de tardar 80 segundos a tardar 5 segundos.

No me importaría tanto este tiempo inicial de carga si pudiera mostrar una pantalla personalizada informando al usuario que la aplicación puede demorarse la primera vez que se ejecute.

Otra cosa, las 635 imágenes no las cargo de una vez, sino que voy cargandolas en memoria conforme las necesito en un mismo Sprite, machacando la anterior por lo que el uso de la memoria no es tanto. En cualquier caso he probado a mostrar una imagen inicial antes de cargar nada y el resultado sigue siendo el mismo, por eso creo que es independiente del código.

mentalthink

Entiendo yo es que como el Android apenas lo he tocado no sabia esto. Pues no sabría...

Has comentado que si quitas las imagenes tarda 3 o 4 segundos... Se me ocurre,
porque no haces una carga de 1 jpg anterior a todo el código que tienes , en teoria deberia dejarte mostrar una sola imagen en poco tiempo, una vez que has avisado pues le das a ese código de los 600 y pico sprites... deberia funcionar no?¿...

No se si me entiendes, pero creo que eso debería funcionar, quizás se enfollone un poco el código, pero tampoco creo que sea un gran galimatias.



msx

Si. Eso ya lo intenté, viene por ahí en el tocho que he escrito. Pero no funciona. Sigo creyendo que hace algún tipo de pre procesamiento de la carpeta Media la primera vez que se arranca, quizás para optimizar, aunque sean imágenes que no llegues a usar nunca.

Hark0

Buenas, ¿porque no pruebas a cargar UNA anim que contenga los 600 sprites?

Haces los "tiles" del tamaño del sprite más grande... y para los que sean pequeños... fondo transparente, que en teoria ya lo tienes...

Igual cargar UN SOLO png, te acelera el proceso...

Luego cambias la rutina de pintado de sprites por la de anims...

Ya nos cuentas...

Saludos ;)
http://litiopixel.blogspot.com
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica Development Indie Videogames · Pixel-Art · Retrocomputing · Electronic

Hark0

Sobre lo de los puntitos, entiendo que eso sale mientras carga "la parte GLB" (antes que tu porgrama)...

Intenta meter un cls y un print "cargando" como primeras func, a ver que pasa...

Si se trata de la "precarga" de GLB, me temo que poco puedes hacer.... :blink:
http://litiopixel.blogspot.com
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica Development Indie Videogames · Pixel-Art · Retrocomputing · Electronic

msx

#11
Lo pensé pero se me formaría un lío tremendo en el código porque tendría que recalcular las posiciones de todos los sprites ya que están calculado para los diversos tamaños que tienen. Y me da una pereza...

No se si Gernot podría darnos la posibilidad de cambiar los puntitos por un mensaje personalizado.

PD: me has pisado con otro post, este es de respuesta al primero ;)

Lo de GLB me parece raro porque el retardo solo es la primera vez que se arranca.

mentalthink

QuoteBuenas, ¿porque no pruebas a cargar UNA anim que contenga los 600 sprites?

Que va Hark0 eso lo probé al principio de tener GLBasic con unas 100 imagenes y peta enseguida, aunque lo probe con imagenes grandes, pero eran Jpg's de 40 kb, quizás si se ponen las imagenes en el Heap, que yo aún no sé si GLbasic trabaja todo en la pila que creo que si, por lo que dice de los ejecutables de 40 Mb.. Pero quizás eso de trabajar en el Heap no sea común e igual para PC, androides y demas cosas...

PS: Yo creo que para poder cargar una animación hay que hacer algún invento de streaming, por ejemplo con dos arrays activar uno y luego el otro e ir cambiando como un semaforo, en carga y descarga de memoria... que quizas no funcione tampoco...

Sorry por  :offtopic:

msx

Nueva prueba que confirma mis sospechas.

He hecho una pequeña aplicación que muestra el texto ¡Hola mundo!. Al probarlo en Android ha tardado menos de un segundo en ejecutarse. Ahora he cogido y he añadido la misma carpeta Media de mi otra aplicación, la que tiene 665 archivos de imágenes y he vuelto a compilar para Android. Ahora la aplicación tarda casi 80 segundos en arrancar la primera vez, y eso que las imágenes no sirven para nada. Por lo tanto se confirma que no es problema de código, sino que por algún motivo GLB hace una especie de preprocesado de la carpeta Media la primera vez que se carga.

¿Alguna solución?


msx

Pues parece que el problema ya se expuso en el foro inglés.

http://www.glbasic.com/forum/index.php?topic=7949.0

¿Alguien con conocimiento me dice como puedo cambiar los puntitos por un loading...?