PDA

Ver la versión completa : Sincronismo de la pantalla



agustig
17/12/2003, 21:06
Alguien me puede explicar como sincronizar con el sincronismo vertical o horizontal de la pantalla de la gp32?
Se que no es trivial el tema por lo que he entendio pero MrSpiv tiene algun codigo que lo hace, pero no acabo de pillar el tema. Gracias.

Miki-chan
18/12/2003, 20:03
Me temo que no entiendo la pregunta.

Yo con la pantalla tengo otro problema. No sé dónde se definen los FPS y, en un código de prueba que hice, pinto la pantalla de un color diferente en función de qué tecla de dirección se pulsa, pero no pinta toda la pantalla, si no que pinta un cuadro y, al mantener pulsado, pinta el cuadro muy rápido en distintos sitios :S

Creo que lo podría solucionar haciendo un FLIP (que reduce el parpadeo al no dibujar directamente sobre la pantalla si no que lo hace sobre un buffer auxiliar y luego cuando está todo en el buffer, dibuja la pantalla), pero no he encontrado el tema bien documentado. En la API del SDK 2.1.5 no pone nada y en la del API 1.0 viene algo pero no indica el cómo se usa, sólo para qué sirve y además, mirando el código del GPGames (miro mucho ese código porque tiene un montón de cosas útiles) veo que pone un #define LCD FLIP con una serie de parámetros que no entiendo y que no sé si es lo que me hace falta.

agustig
19/12/2003, 01:00
Je, je... si en el DiscShop lo he hecho todo con dos buffers, pintas todo en uno, y luego lo muestras, luego te esperas un ratito y a correr, mañana te pongo algo de codigo sobre el tema... Lo del sincronismo tambien lo tengo + o - claro, tb lo apuntare. Me lo han explicado en el canal de irc.

agustig
19/12/2003, 10:17
Lo prometido es deuda:
Trabajara con doble buffer:

---8<---------------------------------------------
...
/* Aqui definimos dos buffers de pantalla, y un indice. */
GPDRAWSURFACE gpDraw[2];
int nbuffer;
unsinged char color=1;
unsigned int ticks;

/* Inicializamos los dos buffers */

nbuffer= 0;
for(i=0; i < 2; i++) {
gpDraw[i].buf_w = GPC_LCD_WIDTH;
gpDraw[i].buf_h = GPC_LCD_HEIGHT;
gpDraw[i].ox = gpDraw[i].oy = 0;
GpLcdSurfaceGet(&gpDraw[i],i);
GpRectFill(NULL, &gpDraw[i], gpDraw[i].ox, gpDraw[i].oy, gpDraw[i].buf_w, gpDraw[i].buf_h, 0x0); /* Ponemos los dos buffers a negro */
}

GpSurfaceSet(&gpDraw[nbuffer]); /* Con esta funcion muestras el buffer que quieres */
GpLcdEnable();

/* Bucle Infinito */
while (1)
{
/* Primero seleccionamos el buffer que no esta activo, o sea si tenemos nbuffer = 0 ha de ser 1, y si es 1 ha de ser 0. */
/* Una forma facil incrementar, y hacer modulo de 2. ( ej. nbuffer++;nbuffer%2; )
Pero a mi me gusta más hacer xor, y para asegurar el tiro hago un and y luego un xor */
nbuffer &= 0x01;
nbuffer ^= 0x01;

/* A la hora de pintar algo en el nuevo buffer */

GpRectFill(NULL, &gpDraw[nbuffer], gpDraw[nbuffer].ox, gpDraw[nbuffer].oy, gpDraw[nbuffer].buf_w, gpDraw[nbuffer].buf_h, color++ );

/* Lo mostramos */
GpSurfaceSet(&gpDraw[nbuffer]);

/* Ahora esperamos unos cuantos ticks, así tampoco hemos de esperar el sincronismo */
ticks = GpTickCountGet();
while ((GpTickCountGet() - ticks) < 10)
if (GpTickCountGet() < ticks) ticks = GpTickCountGet();
/* Este if lo hago para no tener problemas con el overflow de ticks. */

}
...

----8<--------------------------------------------

Bueno Seguramente esto no te compile por que he ido cogiendo y quitando cosas, pero espero que te sea de ayuda.

agustig
19/12/2003, 10:24
Sincronismo de pantalla:

---8<-----------------------------------------------
volatile long *lcdcon1 = (long *)0x14a00000;

int time = 1; /* time va de 1 a 320 columan que toca.*/

while(time!=(((*lcdcon1)>>18)&0x1ff));
---8<-----------------------------------------------

Casi podria hacer un tutorial para el concurso :D

Miki-chan
19/12/2003, 23:56
Gracias. Mañana lo probaré que hoy ya no me da tiempo.

La verdad es que yo cada vez que hago algo, lleno el programa de comentarios para enterarme bien XDDDD.

Me temo que no soy muy autodidacta para algunas cosas.