|
|
|
A la hora de programar
gráficos es muy importante conocer el concepto de retrazado vertical.
Para comprender esto hay que conocer como funciona el tubo de rayos catódicos
de nuestro monitor. Existe un cañón de electrones en la parte
posterior del monitor que mantiene los pixeles "refrescados" con sus correctos
valores cada 1/60 segundos (60 Hz) o 1/70 segundos (70 Hz) dependiendo
de la frecuencia del monitor. Este cañón dispara un haz de
electrones a cada píxel, fila a fila. El retrazado vertical es el
tiempo que tarda el haz de electrones en retornar desde la esquina inferior
derecha, en su orientación hacia la esquina superior izquierda,
donde comienza de nuevo el barrido de la pantalla. Durante ese tiempo no
se emiten electrones. Este es un período extremadamente corto
en el que apenas parece que dé tiempo a nada, pero no es así.
Durante este tiempo se puede cambiar cualquier parte de la memoria de vídeo
sin que la circuitería de vídeo se “entere”, por lo tanto
no se actualizarán los cambios en pantalla. De esta forma, los gráficos
actualizados no se verán afectados por esos efectos que todos hemos
visto alguna vez y que suelen ser los siguientes:
Cuando la pantalla completa o una imagen muy grande se desplaza desde la izquierda hasta la derecha, suele aparecer como cortada, es decir, una parte superior está más desplazada hacia una dirección que la parte inferior. Esto ocurre porque el barrido vertical pilla a la actualización de la memoria de vídeo antes de que termine, por lo que aparecerá la parte actualizada superior y la todavía no actualizada inferior, y así vamos propagando los retrasos. Otro efecto es el de la nieve o "fuzz". Se produce cuando hay algún efecto de paleta, como por ejemplo un fundido en negro donde se va oscureciendo paulatinamente la imagen. Entonces aparecen unas líneas a veces, otras veces son numerosos puntos blancos, e incluso otras, la imagen se distorsiona. Esto ocurre porque para realizar los efectos de paleta, el decremento hasta el color negro en este ejemplo, se hace de forma continua y el barrido vertical "pilla" continuamente a la actualización de los valores del DAC (Convertidor analógico digital ) de vídeo de donde toma la intensidad que le tiene que asignar al electrón que tiene que lanzar en ese momento. El último efecto y muy importante sobre todo para los juegos, es que cuando no se utiliza esta técnica y hemos creado por ejemplo, una animación donde se desplazan a la vez decenas de pequeñas imágenes, dependiendo del computador en que se esté ejecutando irá más rápido o más lento, algo no deseable en estos casos. Imaginemos que estamos jugando al Tetris y no implementa esta técnica. Si el que lo programó lo hizo en un 386, lo verá “bien" en su ordenador, y todos los que tengan este modelo, también. Pero supongamos que lo ejecutamos sobre un 8086. Irá terriblemente lento y casi injugable, puesto que como el programador lo veía bien en su computador, no se esforzó mucho en optimizar las rutinas. Sin embargo, si ese mismo programa se ejecuta en un Pentium Pro a 200Mhz, el jugador se desesperará igualmente, pero no porque sea lentísimo, sino porque apenas le dará tiempo a ver las piezas y terminará la partida casi antes de empezar. Por el contrario, si se piensa en la técnica del barrido vertical, se podrá aprovechar un detalle: no importa la velocidad del computador, casi todos los monitores tienen la misma frecuencia de barrido, con lo que si se usa el procedimiento anterior, se verá ese programa a la misma velocidad en cualquier computador, puesto que lo único que hace el procedimiento es esperar y retener al procesador mientras el barrido esté activo, y liberarlo cuando el haz de electrones retorne a su posición inicial. De esta forma se controla la velocidad de una forma cómoda. Y añadiéndole que soluciona los anteriores problemas de la nieve y las imágenes cortadas, parece que puede ser bastante interesante su uso. Para conseguir hacer un procedimiento que
se encargue de esperar el retrazado o barrido tendremos que hacer uso de
los puertos de la VGA. Para esto se usará el puerto INPUT STATUS
REGISTER 1, que es el 03DAh que ofrece la señal de retrazado vertical
en su bit 3, de forma que podremos detectar en cualquier momento si hay
un retrazado efectuándose, pero nosotros no sabemos si el haz de
electrones esta abajo del todo, o esta en medio de la pantalla, por eso
deberemos de esperar a que el haz vuelva a estar arriba en la pantalla.
Es muy aconsejable hacer este procedimiento en ensamblador ya que un barrido
es cuestión de milisegundos y la rutina debe ser muy rápida.
Pero como las optimizaciones se encuentran
en otra sección, veremos como hacer este procedimiento en lenguaje
c puro. Veamos:
Pero que hace exactamente este código. En el primer ciclo leemos un byte del puerto 3Dah y comprobamos su bit numero 4, si esta a cero esperamos, esto significa que el retrazado esta activo. Luego en el segundo ciclo, nuevamente leemos el byte del mismo puerto y verificamos nuevamente y esperamos hasta que el retrazado no este activo. Por el momento no veremos ejemplos, per en otras secciones podrás ver aplicaciones usando esta técnica, especialmente en lo referente a efectos, uso de sprites, pantallas virtuales, etc.
|