void set_fps( int nº_imágenes_por_segundo, int retrazo_vertical )


Descripción:

Esta función es la que regula la velocidad a la que van los juegos; define el número de imágenes por segundo que se mostrarán del juego (el número de fotogramas por segundo).

Por defecto la visualización se regulará a 30 imágenes por segundo, lo cual quiere decir que si un proceso se mueve un punto por cada imagen (FRAME), éste se moverá en pantalla a una velocidad de 30 puntos por segundo.

Esta función puede fijar el número de imágenes por segundo (FPS, Frames Per Second) desde 1 como mínimo hasta cualquier numero como máximo; en general no son necesarias más de 30 imágenes por segundo para conseguir un movimiento fluido y suave.

Si en esta función se define 0 o negativo como numero de imágenes CDIV dejará de regular los fps e ira a la máxima velocidad permitida por su equipo.

El segundo parámetro retrazo vertical (vsync) (Activa = 1 / desactiva = 0) la sincronización vertical para el refresco de pantalla, es decir: espera al retrazo vertical para actualizar la pantalla, evitando así los parpadeos de pantalla.

Activando esta variable global el sistema ira como máximo al la frecuencia de actualización de el monitor, es decir: si tenemos un monitor que va a 60Hz el fps máximo será de 60fps, las velocidades recomendadas con sincronización vertical son los múltiplos de dicha frecuencia es decir si la frecuencia de actualización es 60Hz lo recomendado seria fps de: 60, 30, 20, 15, 10. Se puede obtener la frecuencia de actualización de pantalla a través de la función get_refresh_rate().

Nota: Si desactivamos esta variable pueden aparecer parpadeos en pantalla, excepto si utilizamos un fps muy alto.


MAIN_PROGRAM_CDIV
 PRIVATE
  int fichero1, retrazo, refresh_rate;
  char strInfo[100];

BEGIN_PROGRAM

 set_gfx(GFX_AUTODETECT_WINDOWED);

 set_mode(m640x480);

 fichero1 = load_fpg("../help.fpg");

 start_scroll(0, fichero1, 8, 7, 0, 3);
 
 refresh_rate = get_refresh_rate() / 2;
 
 if( !refresh_rate )
  refresh_rate = 30;

 set_fps(refresh_rate, 1); 

 retrazo = 1;
 strcpy(strInfo, "Retrazo Vertical - ACTIVADO - [Barra espaciadora para cambiar]");

 write(0, 0, 0, 0, strInfo);
 write_float(0,0,10,0, &fps );

 LOOP{
  scroll[0].x0 += 2;
  scroll[0].y0 += 2;

  if( scan_code != last_key )
   if( key(_space) && (retrazo == 0))
   {
    retrazo = 1;
    strcpy(strInfo, "Retrazo Vertical - ACTIVADO - [Barra espaciadora para cambiar]");
    set_fps(refresh_rate, retrazo);
   }else if( key(_space) && (retrazo == 1))
   {
    retrazo = 0;
    strcpy(strInfo, "Retrazo Vertical - DESACTIVADO - [Barra espaciadora para cambiar]");
    set_fps(refresh_rate, retrazo);
   }

  FRAME;
 }

END_PROGRAM

En el ejemplo vemos como aparece un scroll de pantalla que es la situación más crítica en la que aparece el parpadeo procedente del retrazo vertical, al activar la sincronización vemos como desaparece este parpadeo.

En cada paso del bucle se detectan si se ha pulsado alguna tecla para poder modificar el retrazo, con la función set_fps().

Nota: La variable global fps mantiene actualizado el número de imágenes por segundo que se están consiguiendo realmente en el programa.


Ver: FRAME - set_mode() - fps