Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





duda con desplazamientos inferiores a un pixel por frame

Iniciado por Hechelion, 20 de Febrero de 2009, 10:12:01 AM

« anterior - próximo »

Hechelion

buenas.

estoy haciendo un pequeño juego de naves con scroll horizontal y scroll parallax (para probar las clases que he creado) , el problema que tengo es que estoy intentando que el fondo del juego se desplace lentamente pero cada vez que programa que el fondo avance unos 6 pixel por segundo (tengo 60 FPS)  se ve horrible ya que el fondo se ve estático por 10 Frame y de pronto avanza uno dañando la estética (no se ve fluida la animación).
¿hay alguna forma de solucionar ésto o simplemente tengo que fijarme un limite de un pixel por frame en los desplazamientos?

[EX3]

Esto quien lo sabe bien, y en su dia me lo explico aunque no lo recuerdo  ^_^', es TheAzazel, ya que lo implemento en su libreria CRM32Pro, pero como este no se pasa apenas por el foro sera dificil preguntarle.

Aun asi, he estado probando a mover un fondo grande en scroll a 6 pixel por ciclo del bucle limitado a 60 fps y no he notado ningun comportamiento erratico en el movimiento en lo que a dx_lib32 respecta. Lo que si he notado es el efecto tipico de repintado por bloques que sucede cuando se pinta sin realizar la espera de refresco del monitor y que puede ser a lo que te refieres. Yo estaba probando en modo ventana, pero solo he logrado que vaya correctamente a pantalla completa y con la espera de sincronizacion vertical (vsync) activada. En modo ventana suponia que el vsync funcionara pero solo limita el numero de fps respecto a la frecuencia de refresco del monitor, como en modo ventana se comparte el contexto grafico con el GDI de Windows, osea todo el escritorio e interfaz de ventanas, la espera no se realiza ya que el GDI no lo hace :-\

En resumen, que esto le pasa a practicamente cualquier juego que ejecute en modo ventana. Por otro lado, yo te recomendaria utilizar el modo a pantalla completa para las versiones finales del juego, no sin olvidar dejar la opcion de modo ventana para que el usuario elija, claro, por que asi no solo solucionas este error con el vsync si no que aprovechas algunas caracteristicas como el control gamma para regular el brillo de la pantalla (solo en el juego, no lo aplica a Windows) y ganas algo mas de rendimiento en graficos ya que el contexto de pantalla esta dedicado por completo a DirectX (y ademas, queda mas "cool" y mas "pro" verlo a pantalla completa, o no? 8))

Haz la prueba de ejecutarlo a pantalla completa con el vsync activado, tambien el limite de 60 fps, y me dices si se te soluciona.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

#2
se agradece la explicación, en todo caso 6 pixel por ciclo se me ve fantástico (aun en modo ventana).
El problema lo tenía con movimientos inferiores a un pixel por ciclo  (6 pixel por segundo a 60 FPS son 1 pixel cada 10 ciclos)

Código (vb) [Seleccionar]


AbsPosX = AbsPosX +1
info.x = fix(AbsPosX/10)
info.y = 0
info.Width = 320 'el arncho real de la imagen es de unos 1000 pixel
info.Height = 320
    Call p_gfx.MAP_SetRegion(imagen, info)
    Call p_gfx.DRAW_Map(imagen, 0 0, 8, 1024, 768)



Si te das cuenta, en el código que tengo arriba estaba recortando el área de dibujo en un pixel cada 10 ciclos, pero como tomaba 320 pixel de la imagen y luego los redibujaba a 1024 significaba que ese pixel en pantalla significara un avance de 4 pixel. O sea, entre el ciclo 0 y el ciclo 9 no había cambio y en el ciclo 10 la imagen se movía 4 pixel en pantalla (se ve horrible)


en todo caso logre disminuir bastante el problema cambiando la posición de la imagen, el efecto persiste, pero la verdad es bastante decente.

Código (vb) [Seleccionar]

AbsposX = AbsPosX +1
Call p_gfx.DRAW_Map(imganes,  Fix(AbsPosX / 10) Mod info.Width, PosY, Z, p_gfx.Screen.Width, p_gfx.Screen.Height)

Hechelion

#3
un pequeño vídeo de las pruebas para manejo de Scroll Parallax con la librería.

Este proyecto sólo lo quiero utilizar para probar y afinar las clases, así que lo más probable es que sólo desarrolle algunas cosas, de momento estoy intenta controlar todo mediante archivos de texto, de esa forma puedo permitir una rápida y medianamente fácil configuración del juego, si alguien desea hacerse cargo del proyecto por mi encantado, tampoco tendré problemas en ayudar a esa persona con el código, pero no quiero convertir ésto en mi proyecto principal.

http://www.youtube.com/watch?v=K82Gu_dIT5Y

PD: acá dejo el archivo de texto que configura todo el movimiento de los fondos, como verán es algo bastante simple:

Citar
#Archivo para almacenar información del movimiento de los fondos
# ruta; ancho, alto, deltax, deltay, offx, offy, repetirX,EscalaY
.\Recursos\Fondo002.png,512,400,100,0,0,0,1,360
.\Recursos\marb01.png,300,30,1000,100,0,348,1,60
.\Recursos\marb02.png,300,30,1200,200,0,408,1,60
.\Recursos\marb03.png,300,30,1400,400,0,468,1,60
.\Recursos\marb04.png,300,40,1600,600,0,528,1,80
.\Recursos\marb05.png,300,40,1800,800,0,608,1,80
.\Recursos\marb06.png,300,40,2000,1000,0,688,1,80

tewe76

Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Pogacha

El tema esta en usar punto flotante para posiciones intermedias, con el filtro bi-lineal activado.
Saludos

Hechelion

#6
Pogacha, el concepto me quedó claro, pero no sé si técnicamente  se pueda hacer con Dxlib32, pues las coordenadas las tengo que ingresar como números enteros.

Tewe76, se agradece, ahora estoy mejorando la imagen para ver si logro un efecto similar pero aplicado al eje Y también.

rrbenx

Cita de: Hechelion en 20 de Febrero de 2009, 09:24:22 PM
se agradece la explicación, en todo caso 6 pixel por ciclo se me ve fantástico (aun en modo ventana).
El problema lo tenía con movimientos inferiores a un pixel por ciclo  (6 pixel por segundo a 60 FPS son 1 pixel cada 10 ciclos)

Código (vb) [Seleccionar]


AbsPosX = AbsPosX +1
info.x = fix(AbsPosX/10)
info.y = 0
info.Width = 320 'el arncho real de la imagen es de unos 1000 pixel
info.Height = 320
    Call p_gfx.MAP_SetRegion(imagen, info)
    Call p_gfx.DRAW_Map(imagen, 0 0, 8, 1024, 768)



Si te das cuenta, en el código que tengo arriba estaba recortando el área de dibujo en un pixel cada 10 ciclos, pero como tomaba 320 pixel de la imagen y luego los redibujaba a 1024 significaba que ese pixel en pantalla significara un avance de 4 pixel. O sea, entre el ciclo 0 y el ciclo 9 no había cambio y en el ciclo 10 la imagen se movía 4 pixel en pantalla (se ve horrible)


en todo caso logre disminuir bastante el problema cambiando la posición de la imagen, el efecto persiste, pero la verdad es bastante decente.

Código (vb) [Seleccionar]

AbsposX = AbsPosX +1
Call p_gfx.DRAW_Map(imganes,  Fix(AbsPosX / 10) Mod info.Width, PosY, Z, p_gfx.Screen.Width, p_gfx.Screen.Height)


¿Qué pasará en máquinas que no puedan alcanzar los 60 FPS?

Como te han dicho anteriormente utilizaría numeros en punto flotante y desplazamientos relativos al tiempo de ciclo de render para obtener el mayor rendimiento.

Por cierto, genial el agua del video.
Tap or Die Juego Android Gratis!!
Dungeon break Juego Android Gratis!!
Organic Software
Blog

[EX3]

Coincido con el resto, mola el efecto del agua en el video :)

Cita de: Pogacha en 21 de Febrero de 2009, 04:00:33 PM
El tema esta en usar punto flotante para posiciones intermedias, con el filtro bi-lineal activado.
Cita de: cuatrero rr en 22 de Febrero de 2009, 11:25:34 AM
¿Qué pasará en máquinas que no puedan alcanzar los 60 FPS?

Como te han dicho anteriormente utilizaría numeros en punto flotante y desplazamientos relativos al tiempo de ciclo de render para obtener el mayor rendimiento.
Lo del filtro bilinear, al igual que el trilinear que tambien lo dispone, se puede utilizar mediante la funcion DRAW_MapEx aunque no recuerdo bien si DRAW_Map aplica la bilinear por defecto. Lo de las coordenadas, como bien dice Hechelion, mi libreria solo trabaja con enteros las coordenadas. Tener en cuenta que esta libreria la empece a desarrollar en su momento cuando apenas tenia nociones de nada respecto a graficos ni juegos, mas improvisado e influenciado por cosas como el Div2 o ejemplos antediluvianos en GW-BASIC, razon por lo que quizas la libreria tecnicamente da la impresion de ser un poco obsoleta tanto en su implementacion de cara al programador, la falta de orientacion a objetos por escasa que sea en Visual Basic 6.0 por ejemplo, como por la falta de mecanismos como scrolles, sprites o semejantes, algo comun e imprescindible hoy dia en este tipo de herramientas.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

rrbenx

Desde la más absoluta ignorancia del funcionamiento de dx_lib32, no podría tratarse internamente como "flotantes" y pasarle al api la parte entera? eso resolveria el problema?
Tap or Die Juego Android Gratis!!
Dungeon break Juego Android Gratis!!
Organic Software
Blog

[EX3]

Cita de: cuatrero rr en 23 de Febrero de 2009, 02:02:30 AM
Desde la más absoluta ignorancia del funcionamiento de dx_lib32, no podría tratarse internamente como "flotantes" y pasarle al api la parte entera? eso resolveria el problema?
Internamente trabaja con los vectores de la API de DirectX, osea, en punto flotante, pero la interfaz del ActiveX que toca el programador, dx_lib32, lo trabaja en enteros, por lo que no seria posible introducir decimales desde fuera. Aunque como es sabido no tengo intencion de retocar mas la libreria, y eso va a seguir siendo asi para bien o para mal, pero me interesaria saber exctamente que es lo que comentas para solucionarlo, por pura curiosidad y aprender mas que nada :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

tewe76

La verdad es que me sorprende un poco éso de que trabajes con enteros, aunque, como has dicho, es por el poco conocimiento que tenías cuando empezaste la librería. Yo tengo el mismo problema con el TWSE, y lo sabía, pero el mío no tiene solución porque funciona sobre DDraw, que sólo admite enteros. En tu caso, sobre D3D8, la verdad es que es una pena que no uses floats, porque efectívamente limita muchas cosas.
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

[EX3]

Cita de: tewe76 en 23 de Febrero de 2009, 10:59:30 AM
pero el mío no tiene solución porque funciona sobre DDraw, que sólo admite enteros.
Cabe decir que la version alpha de dx_lib32 que jamas publique en la web (alla por el 2001/2002 recien abanadone el Div2), versiones anteriores a las 1.x que si publique, estaban desarrolladas sobre DirectX7 y por tanto DirectDraw, osea, que cojeo en parte por el mismo mal que tu con la diferencia de que de haberlo sabido plantear mejor podria haber aprovechado el cambio a DirectX8 y haber usado vectores y sus funciones para ciertos calculos que realizo a pelo asi como vertexBuffers para agilizar el render grafico y poder masificar un poco el tema de las llamadas de dibujo, eso y demas cosas que no aprovecha dx_lib32 por la novatada de su programador, de hecho, es que literalmente porte la programacion que tenia en DDraw a D3D8 en vez de rehacerla desde 0. Como ya he dicho en alguna ocasion, mas de uno se asustaria de las chapuzas internas que implementa dx_lib32, para mi es un logro que esto funcione "decentemente" :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

tewe76

Pues nada, nada, a seguir desarrollándola hasta que quede perfecta. ¡¿Qué es éso de dejar las cosas a medias, hombre?! ¡Así va España! :P
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

techmachine

por favor disculpas por escribir en un tema antiguo, pero es para aportar.

lei que no pueden usar punto flotante en las coordenadas...   hay un pequeño truco que descubri para usarlo...  por ejemplo para un movimiento horizontal., declarar una variable posx como currency.

posx = 0

luego por cada loop, sumar un numero menor a 1, por ejemplo  posx = posx + 0.4

finalmente, el truco, es sumarle CERO en la linea de codigo final, por algun motivo, no da error

Call p_gfx.DRAW_Map(imagen, posx + 0, 0, 8, 1024, 768)

espero que se entienda mi ejemplo...






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.