La mejor forma de poner en espara una funcion(retraso)

Consulte acerca de programas, técnicas, algoritmos etc.

La mejor forma de poner en espara una funcion(retraso)

Notapor carlostex » Jue Ene 07, 2010 3:42 pm

Pues he visto en muchos foros esta pregunta, que no solo se hacen los programadores de videojuegos novatos, y resulta un dolor de cabeza, la mayoria conoze la funcion sleep de la biblioteca estandar de C y delay un poco menos conocida, y muchos creen que esto soluciona el problema, asi que voy a explicar una de las mejores formas de hacerlo.

El problema de esas funciones es que pausan la ejecucion del programa por completo,el SO deja e ponerle atencion, lo cual es un problema por que desperdicias tiempo de computo, muy preciado para los programadores de videojuegos.
asi que vamos a usar la biblioteca time. veamos un ejemplo:
Código: Seleccionar todo
#include<time>
#include<iostream>
#include<stdio>
using namespace std;
int main()
{
   long int inicio,fin;
   time(&inicio);
   getchar();
   time(&fin);
   cout<<"transcurrieron :"<<fin-inicio<<" segundos";

}


es muy cencillo pero es la base del control del tiempo.
podriamos usar las siguientes funciones:


Código: Seleccionar todo
long int time_inicio, time_actual;  //variables globales

void reset_time ()
{

    time(&time_inicio);
}

long int current_time ()
{
    time(& time_actual);
    return time_actual - time_inicio;

}
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: La mejor forma de poner en espara una funcion(retraso)

Notapor endaramiz » Jue Ene 07, 2010 8:23 pm

carlostex escribió:El problema de esas funciones es que pausan la ejecucion del programa por completo,el SO deja e ponerle atencion, lo cual es un problema por que desperdicias tiempo de computo, muy preciado para los programadores de videojuegos.

No veo el problema de que pase eso.
Si se sincroniza por framerate, hay que ponerlo a ese estado.
Y si se sincroniza por tiempo, yo siempre suelo añadirle un pequeño delay para que "descanse un poco" el procesador (ya que de momento no he hecho nada que requiera tanto potencial).


Por cierto, que bibliotecas usas para hacer videojuegos? Normalmente ofrecen facilidades para estos temas.


Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor carlostex » Vie Ene 08, 2010 1:35 am

yo uso SDL, de hecho las funciones que puse originalmente usan SDL_GetTicks() en ves de time(), pero quise ilustrar como seria sin una una biblioteca para videojuegos.
Ademas algunas funciones del tipo de sleep dependen del sistema operativo, por ejemplo Sleep es de windows.h, por lo que un programa no seria portable, en cambio time.h es estandar de C.
y por otro lado, he leido que no es nada recomendable parar por completo la ejecucion de tu programa
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Notapor Juanxo » Vie Ene 08, 2010 6:49 pm

yo creo que en ambos casos teneis vuestra parte de razón:

es cierto que nunca es bueno parar del todo el programa, pero siempre y cuando tenga cosas que hacer. El caso que te ponia endaramiz es totalmente válido.
El te dice en el caso de que tu juego te interese que vaya a 30 fps, y resulta que en un determinado momento un frame va más rapido que esos 30 segundos, pues pausas el juego hasta que se ajuste a esos 30 fps.
Aunque endaramiz, es más correcto ajustar todo el juego a framerate variable (eso he leido) ya que así no estarás sujeto a limitaciones externas.
En cuanto a lo de usar time.h por ser estándar y no depender así de compatibilidades, normalmente si usas un api portable (como SDL) supongo que será más correcto usar los métodos de tiempo del API que estarán más orientados a juegos.

Y sin más dejo de divagar

Un saludo
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron