Programación Específica > Programación de Videojuegos

 Se Me Ocurrio Una "ocurrencia"

(1/1)

ibito:
Pues no soy un guru en esto de programar videojuegos, y siempre que hago un "engine" de tiles, redibujo todo en pantalla, entonces, se me ocurrio algo para "mejorar" el performance, talvez asi se haga ya profesionalmente o los que saben mas no se, solo quiero ver si le ven ventajas a esto:

En vez de re-dibujar todo, solo se redibujan los 8 tiles (o 9 incluyendo el del sprite) alrededor del sprite que se mueve, si son varios pues solo los tiles de los sprites que se mueven... en caso de que algun tile sea animado pues el tile animado tambien, dejando intactos los demas tiles... no se si me di a entender... no sean muy duros con sus criticas  :ph34r:




 :P

JuanK:
Sim el escroll se mueve habria que redibujar todos los tiles de todas formas,
sino es asi tu tecnica es muy buebna y se llama dirty reactangles, esta aument nmucho el performance cuan do son pocas cosas animadas, pero si son muchas, por el contrario lo disminuye en exceso.

Neko-sama:
es una tecnica que se usa de forma profecional pero solo se usa para casos especificos...


mira... cuando haces un mapa de tiles es porque quieres hacer una escena bien grande y necesitas moverte en ella ... para eso tienes que mostrar que lo tiles se muevan... y para eso tienes que volver a dibujarlos todos...




lo que uso yo para mejorar el rendimiento...  es que solo pinto los tiles que se ven en pantalla...    no toooodos los tiles...  y no tengo ningun problema de rendimiento... incluyendo mis tiles animados...

y eso que he usado dos capas de tiles... claro... que una no se pinta completa para poder dejar ver la capa de atras... por ejemplo... en una caverna... tienes los tiles del marco principal por donde anda tu personaje y atras dejas ver los tiles del fondo de la caberna... eso lo puedes convinar con otra capa (una tercera) que muestre una imagen estatica de algo muy al fondo... de esa forma no tienes que dibujar tooodos los tiles que esten en pantalla... solo los pocos que uses para decorar cada capa...

si haces un juego tipo zelda... es una sola capa de tiles que necesitas y no debe ser mucho la exigencia de un computador la usar eso...

Amilius:

--- Cita de: "ibito" --- Pues no soy un guru en esto de programar videojuegos, y siempre que hago un "engine" de tiles, redibujo todo en pantalla, entonces, se me ocurrio algo para "mejorar" el performance, talvez asi se haga ya profesionalmente o los que saben mas no se, solo quiero ver si le ven ventajas a esto:

En vez de re-dibujar todo, solo se redibujan los 8 tiles (o 9 incluyendo el del sprite) alrededor del sprite que se mueve, si son varios pues solo los tiles de los sprites que se mueven... en caso de que algun tile sea animado pues el tile animado tambien, dejando intactos los demas tiles... no se si me di a entender... no sean muy duros con sus criticas  :ph34r:




 :P
--- Fin de la cita ---
La idea es buena, sería mejor que lo generalices a rectángulos en lugar de grupos de tiles. Si tu algoritmo principal puede dibujar la escena de tu juego limitándose al área de un rectángulo entonces podrías optimizar bastante al evitar transferencias de memoria innecesarias. En el juego de rol que hice, aunque se mueve con scroll, esta es una parte esencial tanto para evitar dibujar en vano en zonas que están tapadas por ejemplo por un menú opaco y además que garantiza control de límites: en los algoritmos que realizan transferencia de memoria ya no tengo que preocuparme si el elemento que estoy dibujando está saliendo de la zona donde puedo dibujar. Si la zona rectangular que voy a dibujar se "sale" de la zona de la pantalla (en general la zona que hay que redibujar), un algoritmo lo recorta y actualiza su posición y dimensiones:

Este código también sirve si aplicarás efecto de reflejo vertical a tus imágenes:

--- Código: Text --- function EstaEnPantalla(var rDestino,rOrigen:Trect;const espejo:bytebool):bytebool;//  Determina si la imagen que debe ser dibujada aparece en pantalla y modifica//los rectángulos origen y destino si estos exceden las dimensiones adecuadas.beginwith rDestino do if (left<Limites_Lienzo.right) and (right>=Limites_Lienzo.left) and   (top<Limites_Lienzo.bottom) and (bottom>=Limites_Lienzo.top) then begin   result:=true;   //Reducir el tamaño del cuadro si sale de pantalla   if espejo then   begin//caso del espejo     if right>Limites_Lienzo.right then     begin       right:=Limites_Lienzo.right;       rOrigen.Left:=rOrigen.Right-right+left;     end;     if left<Limites_Lienzo.left then     begin       left:=Limites_Lienzo.left;       rOrigen.right:=rOrigen.left+right-left;     end;   end   else   begin// caso normal     if right>Limites_Lienzo.right then     begin       right:=Limites_Lienzo.right;       rOrigen.Right:=rOrigen.Left+right-left;     end;     if left<Limites_Lienzo.left then     begin       left:=Limites_Lienzo.left;       rOrigen.Left:=rOrigen.Right-right+left;     end;   end;   if bottom>Limites_Lienzo.bottom then   begin     bottom:=Limites_Lienzo.bottom;     rOrigen.Bottom:=rOrigen.top+bottom-top;   end;   if top<Limites_Lienzo.top then   begin     top:=Limites_Lienzo.top;     rOrigen.top:=rOrigen.Bottom-bottom+top;   end; end else   result:=false;end;  

Navegación

[0] Índice de Mensajes

Ir a la versión completa