Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





[ayuda J2m]juego Lento Con Imagenes Transparentes

Iniciado por videador, 08 de Marzo de 2006, 01:35:02 PM

« anterior - próximo »

videador

 EDITO: En el titulo sale J2M perdonad no puedo editarlo.

Hola muy buenas a todos.

Resulta que estoy haciendo un juego para aprender J2ME. Simple, tipo puzzle, ya funciona todo.

El caso es que al meterle imagenes transparentes la velocidad del juego en el movil se reduce mogollon. En el móvil donde lo pruebo, una N-Gage (MIDP 1.0 CLDC 1.0).

Sin imagenes transparentes me da una velocidad entorno a 47 milisegundos cada vuelta del loop (lógica y render). De paso pregunto si se podría decir con eso que 1000/47=21 FPS.

El caso es que cuando meto las imagenes PNG transparentes, se me sube a 90-100 milisegundos en el movil. En el emulador va sin problema a velocidad fija.

Las imagenes transparentes las hago con el PhotoShop:

  -Nuevo (Fondo transparente)
  -Hago mi imagen
  -Image -> Modo -> Color indexado -> Los transforma con paleta exacta (normalmente la imagen no tiene     mas 5 de colores) y conservando la transparencia.
  -Guardo como un PNG.

En cambio los imagenes sin transparencias tienen el modo RGB y tambien son PNG.

Uso las API de MIDP 1.0 la unica clase de APIs de las marcas especificas es un FullCanvas de las API de nokia.

Aqui os dejo las dos imagenes -sin transparencias y con transparencias-, por si a lo mejor el formato hace que vaya mas lento o cualquier cosa que desconozco.




No riais que aun no tengo grafo.

¿Alguien sabe que puede estar pasando?. ¿O alguna herramienta para crear el formato de las imagenes que se suela utilizar?.

Un saludo!

sés

 Creo que ya te lo dije: Imágenes en 24 bits = malo

Son MUY lentas en la mayoría de los móviles. Jamás las utilices si no son estrictamente necesarias (cosa que dudo mucho). Todas en color indexado, salvo casos estrictamente necesarios.
Soy indeciso... ¿o no?

videador

 Que mal me explico  :(

Es al reves.

Ahora mismo acabo de pasar todas a Modo Indexado incluido los fondos. Y es cuando me va lento. Si pongo las imagenes que usaba antes (Modo RGB) el juego va mucho mas rapido.

Es justo al reves. ¿¿??

En el primer post la transparente (la segunda) es la que tiene modo indexado y la otra es la que tiene modo RGB.

sés

 Cosas que ralentizan bastante:

- Imágenes en 24 bits. Según el móvil, puede ir lentiiiisimo.
- Imágenes transparentes. Evidentemente es más lento que las que no lo son.
- Dibujar muchas imágenes.

No sé lo que estás pintando ni ccomo, pero ten en cuenta esto.
Soy indeciso... ¿o no?

videador

 Sin contar el fondo y primitivas y resumiendo hago esto.

Tengo una matriz de images 7x2.

Cargo la imagenes en la matrix.

imgMatrix[0][0]= Image.createImage("/verde14.png");
imgMatrix[1][0]= Image.createImage("/amarillo14.png");
imgMatrix[2][0]= Image.createImage("/azul14.png");
imgMatrix[3][0]= Image.createImage("/morado14.png");
imgMatrix[4][0]= Image.createImage("/gris14.png");
imgMatrix[5][0]= Image.createImage("/naranja14.png");
imgMatrix[6][0]= Image.createImage("/rojo14.png");
      
//Usamos el mismo
imgMatrix[0][1]= Image.createImage("/negro.png");
imgMatrix[1][1]= imgMatrix[0][1];
imgMatrix[2][1]= imgMatrix[0][1];
imgMatrix[3][1]= imgMatrix[0][1];
imgMatrix[4][1]= imgMatrix[0][1];
imgMatrix[5][1]= imgMatrix[0][1];
imgMatrix[6][1]= imgMatrix[0][1];

Luego cada bloque para inicializarlo. Le paso un array de imagenes.
En cada bloque tengo una Image[] img al que iguale con i.

ini(...,Image[] i,...){
...
img=i.
...
}

Luego tengo una matriz de bloques 8x8 (es como un tablero).

Los inicializo todos.

bloques[j].ini(...,imgMatrix[el que corresponda]);

Para pintar pues dos for.

for i
  for j
     bloques[j].draw(g);

Dentro de draw:

g.drawImage(img[frameAct],...);

Eso es basicamente lo que hago. Cargo solo las imagenes una vez si no me equivoco lo demas es solo pasar referencias.

Todavía no he optimizado porque este metodo es malo porque se puede hacer sin pasar las referencias a cada bloque y luego solo consultar su indice para pintar, pero lo que me frustra es que la velocidad, no es del todo mala con imagenes que no son transparentes, pero se va todo al garete cuando meto las imagenes  transparentes.

Zaelsius

 Un apunte.. si estás haciendo un juego tipo puzzle, asumo que habrán fichas o bloques que permanecerán estáticos durante un tiempo. Deberias evitar repintar todo aquello que no cambia entre frames... aunque no sé si lo estás haciendo ya así o no.

videador

 Gracias por responder.

¿Entonces no es extraño que se me reduzca tanto el rendimiento por poner imagenes transparentes (colo indexado)?.

Zaelsius es interesante lo que dices pero si en vez un puzzle es uno de acción, ahí si que hay que repintar y hay juegos que van bastante rapido.

¿Que utilizais vosotros para darle formato a las imagenes?.

Y otra cosa, para los sprites, sin usar MIDP 2.0, vosotros en cada clase de personaje -o objeto visible del juego-, le poneis que contenga una variable o array de tipo image o las imagenes se pasan por argumento en el metodo para dibujar el mismo. Quizá tanta variable image haga que vaya tan lento aunque solo cree una vez. Pero de todas formas, como lo he hecho yo sin imagenes transparente va bien, sigo sin explicarme esa subida tan repentina.



videador

 Hola de nuevo

Aqui os dejo la prueba de la diferencia tan brutal entre usar imagenes con transparencias y sin ellas.

Prueba Rendimiento

Es un zip. Hay dos paquetes Jar y el codigo.

MIDP 1.0.

Descomprimir, salen dos carpetas una con transparencias y otras sin transparencias. Estan tambien las dos imagenes que utilizo (Modo Indexado 8 bit con y sin transparencia).

Es solamente la imagen pintada 64 veces (8x8) y el numero que sale es lo que tarda cada vuelta del bucle.

¿Esto es totalmente normal?.

En mi movil (N-Gage) me da con transparencias mas de 75 milisegundos y sin transparencias me da 47-50.

En cada vuelta duerme como minimo 40 ms. O sea que tardaría 35 ms en blitear con transparencias. Y 7-10 sin ellas.

Por favor, decidme comentarios, ¿que opinais de esto los que haceis juegos?, ¿es normal?.

Sorry por ser tan brasas pero es que estoy muy bloqueado con esto, y si el juego se me sube a 100 no es tan jugable como yo quisiera :(.

Un saludo!












jazcks

 ni idea, tb soy novato en j2me y no veo nada raro en el código.

en mi movil mi me da mas o menos lo mismo con/sin transparencias, varia entre 28 - 32, y con transp. sale alguna punta de 36...
resumiendo, unos 30 en ambos casos... lo que no entiendo, si dices que duerme 40 de entrada :P
quizás el "System.currentTimeMillis()" de valores incorrectos en algun movil, eso explicaría que en los emuladores funcionara...

videador

 Jacks gracias por probarlo.

¿Podrías decir que movil tienes?
¿Es Nokia?.

Pues quizá este mal hecho, de hecho esta mal :(. Ahora me tengo que ir cagando leches, a ver si luego lo vuelvo a poner pero de todas formas para algo ha valido. Parece que por lo menos en este Nokia las transparencias van mas lentas, que podría ser perfectamente ¿no?.


Un saludo!

sés

 Yo lo probaré cuando llegue a casa... si no se me olvida :P
Soy indeciso... ¿o no?

jazcks

 
Cita de: "videador"¿Podrías decir que movil tienes?
¿Es Nokia?.
muerte a nokia!, tengo un SE k750, que por cierto es la caña  (ole)
si no encuetras nada tb podría pobrarlo en un nokia de la serie s60
suerte!

videador

 Si no es molestia, podrías pobrarlo que es el tipo de moviles a los que en principio va dirigido.

He leido en foros que hay problemillas con los S60, imagenes transparentes, refresco de pantalla etc.

n3k0








Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.