Permalänk
Medlem

Tidsberäkning

Hej. Har hakat upp mig på ett mindre problem.

Problemet:
En funktion, kallar den update, ska räkna upp en variabel 100 gånger per sekund. Hur ofta update kallas varierar.
Ex:
update körs i 50hz -> variabeln räknas upp dubbelt varje gång.
update körs i 200hz -> variabeln räknas upp varannan gång.
osv...

Tiden mellan anropen till update finns som argument till funktionen (delta).

När funktionen körs för långsamt har jag (tror jag) fixat.
Nuvarande lösning:

diff += 100 - 1/delta while (diff>=100){ //slow variabeln++ diff-=100 } if (diff > -100) //standard variabeln++ else //to fast diff+=100 <-------FEL!

Står helt still nu tyvärr. Kanske är dumt tillväga gångs sätt från början?

Permalänk
Medlem

Du måste spara tiden som någon variabel utanför metoden, så när metoden kallas på nästa gång så vet du hur lång tid det gått totalt, alt bara kalla på metoden utifrån vid rätt tidpunkter. Jag brukar göra så att jag sparar tiden i en klassvariabel tills att den är tillräckligt stor, kör då uppdateringen och sätter tidräknaren till 0.

Permalänk
Medlem

Sparar redan undan tiden utanför metoden. Därifrån jag räknar ut tidskillnaden som jag sedan skickar vidare in.
Det går inte att bestämma hur ofta metoden kallas.

Att veta total tid borde inte hjälpa heller, då det egentligen inte är en variabel som ska räknas upp i 100hz utan en viss metod. Så vet inte hur många gånger den körts.

Permalänk
Medlem
Skrivet av jurgen89:

Sparar redan undan tiden utanför metoden. Därifrån jag räknar ut tidskillnaden som jag sedan skickar vidare in.
Det går inte att bestämma hur ofta metoden kallas.

Att veta total tid borde inte hjälpa heller, då det egentligen inte är en variabel som ska räknas upp i 100hz utan en viss metod. Så vet inte hur många gånger den körts.

Det är meningslöst att injicera deltavärdet om metoden redan har tillgång till det.

Du vill ha något sånt här (otestad kod):

class TimeTracker { private int updateFrequency = 100; // hertz private int cycleTime = 1000 / updateFrequency; // 1 sekund (1000 ms) delad i 100 delar == vår cycle-time private long lastFullCycle; private int cycleCounter; // variablerna initieras på önskat vis private void update() { long nowTime = System.currentTimeMillis(); long timeDiff = nowTime - lastFullCycle; if (timeDiff >= cycleTime) { // om tidsskillnaden är större än vår cykelfrekvens ökas räknaren cycleCounter += timeDiff / cycleTime; // ex: 300 millisekunder sedan förra update() = [cycleCounter += 3] när [cycleTime == 100] lastFullCycle = nowTime; } } }

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Fungerar nu, inte hårdtestat än dock. Tack för hjälpen!