Hola, estoy desarrollando un juego para moviles y en los emuladores me va bien de velocidad, pero al pasarlo a un movil (el Nokia 6630) me va lentisimo. Sin embargo en un motorola no me va tan mal. ¿Alguien sabe a que se puede deber?
Gracias
Optimizar.
Optimizar... es decir... hacer un juego para cada cosa (grrr)
Yo a mi juego lo pruebo en diferentes versiones de emuladores Nokia ( no tengo un móvil de esos ) y en cada versión funciona distinto. Lo mismo ocurre con el emulador mpowerplayer.
En una versión pinta las letras de distintos colores, en otra no me reconoce el RecordStore y siempre me abre uno nuevo, en otra me tira un error de puntero nulo que aún no encuentro... en fin.
Este párrafo lo saqué de un hilo en el foro de GameLab, es una frase de John Carmack sobre el tema:
Write-once-run-anywhere. Ha. Hahahahaha. We are only testing on four platforms right now, and not a single pair has the exact same quirks. All the commercial games are tweaked and compiled individually for each (often 100+) platform. Portability is not a justification for the awful performance.
creo que eso deja en claro todo esto de la portabilidad en J2ME y móviles :angry:
¿como lo podria optimizar?
La verdad es que esto es bastante desesperante. Las cosas van en los emuladores (o en alguno al menos) las llevas a un movil y te hace mil cosas raras.
Yo empezaría mirando el bucle principal.
Seguramente tengas un Thread.sleep o algo parecido para obtener los ciclos por segundo deseados...
En esta página tenés infinidad de información sobre los Nokia y móviles en general:
Página con info
Efectivamente en el bucle principal tengo un thread.sleep (tambien he usado el wait por si el excesivo retardo se debia a eso)
He establecido que el bucle se ejecute una vez cada 80 milisegundos.
El bucle (sin contar el retardo) se ejecuta en bastantes menos milisegundos (20 de media), sin embargo luego el juego va lento en el nokia 6630 y no en un motorola.
Esta muy bien la pagina q me comentas (con el inconveniente de estar en ingles) , ya me habia imprimido y leido bastantes de esos documentos.
¿q podria hacer para optimizarlo y q me fuera mejor?
Chechocossa, si no has podido probar tu juego en algun movil real quiza te lleves una desagradable sorpresa como me ha ocurrido a mi. Son muchas las cosas que no funcionan igual en un emulador q en un movil real.
Ya sé que mi juego seguramente no se comporte como se espera en un móvil.
Lo estoy desarrollando para el concurso de Movilgamers y allí exigen que corra en un par de emuladores, así que simplemente pienso optimizarlo para eso. Luego, si el juego interesa, ellos se harán cargo del port al móvil.
Como optimizar, hay de todo. Tendrías que considerar la compresión de las imágenes, el uso de la memoria, etc.
Por ejemplo, yo acostumbro a programar accediendo a propiedades de una clase a través de método del tipo get-set. Cosas de este tipo no están recomendadas para los móviles. Accediéndose directamente a las propiedades, aunque no sea lo ideal de la POO, hace que tu código responda más rápido. Bueno, es un ejemplo.
Es como dice Carmack, un juego para cada dispositivo.
En mi estructura de archivos, yo tengo dispuestas carpetas que contendrán las fuentes para cada dispositivo al cual deba portarlo :angry:
Yo me copiaría todos tus fuentes a otra carpeta y comezaría a modificarlos, olvidándome de cómo funciona en el Motorola y pensando sólo en el Nokia.
Yo tambien lo estoy desarrollando para el concurso, pero aun asi me gustaria q funcionara en mi movil y en los moviles a los que tengo acceso.
El juego no lo habia desarrollado especificamente para el motorola, mas bien estaba pensado para los de las s60 aunque solo tuve en cuante las dimensiones de la pantalla de los s60. ¿Que mas deberia tener en cuenta para que funcionara mejor en la serie 60? ¿que deberia modificar en las fuentes para hacer el juego especificamente para el s60?
En el emulador de la s60 va genial. Pero me estoy dando cuenta de que los emuladores no son demasiado fieles a la realidad...
Pues yo estoy utilizando la API de Nokia y siempre respetando el MIDP 1.0
De la API, lo único que aprovecho por ahora es el FullCanvas y la opción de DirectGraphics que me permite manipular la imagen en espejo y rotación ( lo cual, te aviso, también tiene sus diferencias en los distintos emuladores (nooo) )
Por el resto... nada distinto a lo que he leído en foros, pdf´s, etc.
Quiza el problema no sea de optimizacion (aunque seguro que se podria optimizar bastante) ya que todo el bucle del juego, incluyendo el dibujado en pantalla, se ejecuta en muchos menos milisegundos de los 80 que tengo establecidos que dure el bucle, asi q en cada ciclo le tengo que hacer esperar.
Haz que no espere y pruébalo en el móvil, si va bien es problema de que algún calculo de tiempo entre frame y frame no se hace bien y esta esperando mas de la cuenta, si va igual es que pintas mas de lo que soporta el móvil y/o ejecutas muchas instrucciones.
¿Con que móvil de la serie 60 lo estas probando? Si quieres bájate el juego del nosferatu de mi web y pruébalo, debería irte a las 10 fps que esta limitado.
Tu juego me va perfecto, muy chulo por cierto.
He probado a quitarle el retardo y tambien he quitado la mayoria de instrucciones de proceso del juego (actulizacion del mundo, enemigos, etc) y va un poco mejor, pero deberia ir super deprisa, de echo en el emulador va rapidisimo.
Me inclino a pensar que el problema este o en el dibujado de las imagenes o quiza que al tener muchas imagenes cargadas en memoria se ralentice.
El jar ocupa solo 60kb
Lo malo de los emuladores es que no son fíales al móvil físico, no obstante puedes emular la velocidad de un móvil en la configuración del emulador, pero esto ya depende de que emulador uses o en que estes programando.
Los consejos que puedo darte sobre dibujar imágenes son los clásicos, no pintes fuera de la pantalla, crea un doble búfer si no existe, usa el clip para pintar lo justo, procura meter todas las imágenes en una misma imagen, por lo menos las que tengan relación sin pasarte de 256x256 o 128x128 por ejemplo, procura que las imágenes sean múltiplo de 2 y si puedes pinta siempre en coordenadas X pares ya que ira mas rápido.
Despues de hacer mil pruebas he llegado a algunas conclusiones.
Parece que el problema esta cuando dibujo las casillas del fondo, estoy utilizando midp2 y la clase TiledLayer
Siguiendo tus consejos y poniendo que las imagenes tengan dimensiones pares he consiguido algo de mejora en la velocidad
Y tambien dibujando en las posiciones pares.
Estoy utilizando el flushgraphics, entiendo que por lo tanto estoy usando doble buffer ¿me equivoco?
He quitado el retardo que hago cada ciclo y aunque ahora me va un poco mejor me sigue yendo lento.
¿Se os ocurre algo mas?
Es curioso, pero en el motorola q se supone q es un movil bastante peor el juego va mas rapido.
Gracias
Comprueba que no estés usando imágenes de 24 ó 32 bits.
Si, estaba utilizando imagenes de 24 bits. ¿que formato recomiendas que permita utilizar transparencias? Es para usarlo con la clase tiledLayer, estoy usando midp2
Debes de convertir las imágenes a 8bits e indicar que color es el transparente, yo uso el photoshop la opción guardar para web.
¿Lo de establecer el color transparente te refieres con el photoshop o luego mediante programacion?
Si es mediante programacion ¿como lo haces?
Con el photoshop he conseguido dandole a guardar como web que coja los 8bits, pero no se tampoco donde establecer el color transparente.
En el momento antes de guardar, cuando ves tu imagen, a la izquierda tienes un gotero.
Con el gotero, click sobre cuál será el color transparente.
Luego click en el ícono cuadriculado que encuentras a la derecha abajo, en la tabla de colores.
Eso te debería pasar el color a trasparente.
Ahí ya lo guardas y listo.
No necesitas nada de programación para eso.
Eso el lo que hacia, pero al guardarlo siempre se me guardaba con una profundidad de 32 bits, aunque en el formato le ponga PNG8
Si no le establezco el color transparente y seleccionanndo PNG8 se me guarda con 8 bits de profundidad.