Merjenje časa

Za vse novince v izdelovanju iger.

Merjenje časa

OdgovorNapisal/-a koscak » Ne Jan 22, 2012 10:44 pm

Ker imam lažje probleme pri FPS-jih, sedaj sem doličil z gluttimerfunction(1000/FPS, Update,1); Vendar sem zvedel da moram za vsak premik ladje, sovražne ladje metka itd merit čas in da ne gre tako mi lahko kdo to pove prosim ;)

Se že v nparej zahvaljujem.
LP
Matej
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: Merjenje časa

OdgovorNapisal/-a koscak » Po Jan 23, 2012 12:03 am

Ali je možno da je kaj tekga za merjenje časa in potem me zanimo kero spremenlljivko še podam na koncu pri
x=x+hitrost*čas ???
http://www.programmersheaven.com/2/time-fps
brav tale tutorial

Koda: Izberi vse
float lastUpdate        = 0;
float fpsUpdateInterval = 0.5f;
int  numFrames         = 0;
float fps               = 0;
// Called once for every frame
float  timeAtGameStart;
UINT64 ticksPerSecond;
float GetGameTime()
{
  UINT64 ticks;
  float time;
  // This is the number of clock ticks since start
  if( !QueryPerformanceCounter((LARGE_INTEGER *)&ticks) )
    ticks = (UINT64)timeGetTime();
  // Divide by frequency to get the time in seconds
  time = (float)(__int64)ticks/(float)(__int64)ticksPerSecond;
  // Subtract the time at game start to get
  // the time since the game started
  time -= timeAtGameStart;
  return time;
}

// Called once at the start of the game
void InitGameTime()
{
  // We need to know how often the clock is updated
  if( !QueryPerformanceFrequency((LARGE_INTEGER *)&ticksPerSecond) )
    ticksPerSecond = 1000;
  // If timeAtGameStart is 0 then we get the time since
  // the start of the computer when we call GetGameTime()
  timeAtGameStart = 0;
  timeAtGameStart = GetGameTime();
}
// Called every time you need the current game time


void UpdateFPS()
{
  numFrames++;
  float currentUpdate = GetGameTime();
  if( currentUpdate - lastUpdate > fpsUpdateInterval )
  {
    fps = numFrames / (currentUpdate - lastUpdate);
    lastUpdate = currentUpdate;
    numFrames = 0;
  }
}

// We'll need some starting values
float lastGameTime = 0;
float position = 0;
float velocity = 1;
// Here's where we compute how much
// time has passed since last update
float GetDeltaTime()
{

  float dt = GetGameTime() - lastGameTime;
  // Increment with dt instead of calling
  // GetGameTime() to avoid loosing time
  lastGameTime += dt;
  cout<<dt;
  return dt;
}
// A function for moving the object
void MoveObject(float dt)
{
  position += velocity*dt;
}
// This is what should be done every frame
void EveryFrame()
{
  // First we'll render the frame
//  RenderFrame();
  // Then we'll move our objects
  float dt = GetDeltaTime();
  MoveObject(dt);
}
// We need a new variable for the acceleration
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: Merjenje časa

OdgovorNapisal/-a Blodyavenger » Po Jan 23, 2012 11:24 pm

Pravilno je tako, kakor si izvedel.

Temu času s katerim množiš se reče "DeltaTime" in je čas med trenutnim in zadnjim izrisom. Tako poskrbimo, da se na vseh računalnikih enako hitro stvar izrisujejo.

Torej, recimo da imamo hitrost 100.0f;
Če nekemu objektu povečamo pozicijo X za 100.0f * deltaTime bi moral objekt narediti pot 100 pikslov v 1 sekundi :)

metek.x = metek.x + (metek.speedX * dt);
zidek.y = zidek.y - (metek.speedY() * dt);

Ni treba vsakemu objektu merit tega časa, saj ga dobiš enkrat na "loop", nato pa ga uporabljaš povsod, kjer posodabljaš objekte (premikanje).
Torej, spremenit boš moral funkcije, kjer se objekti posodablajo in jim dodat parameter "float dt" oz. kakorkoli pač želiš, da boš tako podajal to vrednost okoli.

npr.

Koda: Izberi vse
void Move( float dt )
{
  ...
  ...
  ...
}


Delta time pa izračunaš v glavni posodobitveni funkciji na začetku.

float dt = currentTime - lastTime;

kako dobiš čas v GLUT-u pa nevem, se boš moral sam pozanimat.
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: Merjenje časa

OdgovorNapisal/-a koscak » Po Jan 23, 2012 11:43 pm

Aha odlično no jaz sem čisto drugače delal do sedaj sem imel x+=0.005 to je bilo ti in za tokle sem prmeikal...
Tole so psremenljivke :) Mogoče je tako prav ...
Koda: Izberi vse
bool spremenljivka;
bool spremenljivka2;
float dt;


main
Koda: Izberi vse
spremenljivka=QueryPerformanceFrequency;
spremenljivka2=QueryPerformanceCounter;


update
Koda: Izberi vse
bool  zapis=spremenljivka2;
spremenljivka2=QueryPerformanceCounter;
dt=spremenljivka2-zapis;
cout<<"dt:"<<dt;
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: Merjenje časa

OdgovorNapisal/-a koscak » Po Jan 23, 2012 11:43 pm

Aja pa vedno dt izrisuje z 0 ;(((
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: Merjenje časa

OdgovorNapisal/-a Blodyavenger » Po Jan 23, 2012 11:52 pm

Zakaj pa boolean? :)

Boolean ima lahko vrednosti 0 ali 1, vrednosti s katerimi delaš pa so v oblikah 1.54323f ipd :)
Torej? Boš moral zamenjati te tipe
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: Merjenje časa

OdgovorNapisal/-a koscak » Po Jan 23, 2012 11:54 pm

ja pri float pa jamra če pa dam large intiger pa še bolj ,(((
Taki problemi
C:\Users\Matej\Desktop\igra\igra\main.cpp|1449|error: no match for 'operator=' in 'spremenljivka2 = QueryPerformanceCounter'|
C:\Users\Matej\Desktop\igra\igra\main.cpp|1450|error: no match for 'operator-' in 'spremenljivka2 - zapis'|
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: Merjenje časa

OdgovorNapisal/-a Blodyavenger » To Jan 24, 2012 12:08 am

Točno, QueryPerformanceCounter je funkcija in vrača boolean če uspešno razbere čas. Kot parameter funkcije pa podaš naslov integerja v katerga ti shrani vrednost.


Sem najdu nekaj:

Koda: Izberi vse
__int64 start_count;
__int64 end_count;
__int64 freq;

// Get the frequency and save it, it shouldn''t change
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start_count);

<<<------------------   TUKAJ SE ZGODI VSE!

QueryPerformanceCounter((LARGE_INTEGER*)&end_count);
//find the time
float time = (float)(end_count - start_count) / (float)freq;  <------ spremenljivka "time" je tisto kar ti rabiš -> DeltaTime če se ne motim


Poskusi
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: Merjenje časa

OdgovorNapisal/-a koscak » To Jan 24, 2012 12:30 am

Odlično dela :)
Hvala lepa

lp
Matej
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: Merjenje časa

OdgovorNapisal/-a koscak » To Jan 24, 2012 12:44 am

Ja pa ne čist 100% jaz sme ta tvoj time preimenoval v dt dal kot globalno spremenljivko in potem je tako narejeno da objekt vendo hitrejše leti leti leti leti..
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm


Vrni se na Začetniki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost

cron