Fps weichen um 2 fps ab

Luk10

Top Contributor
Hallo,

Ich habe einen Thread, der mit 60 fps rendern soll. Hier die Schleife dazu:

Java:
@Override
public void run() {

	while (isRunning) {

	    preRender = System.nanoTime();

	    swap();

	    long exactSleepingTime = (long) ((1e9 / 60.0) - postRender); //Exakte Zeit in Nanos
            
        //Aufspaltung in Millis + Nanos für Thread.sleep(milli, nano)
	    int sleepingTime = (int) (exactSleepingTime / 1e6); //Zeit in Millis
	    int additionalSleepingTime = (int) (exactSleepingTime - sleepingTime * 1e6); //Rest in Nanos

	    // System.out.println(sleepingTime + " | " +
	    // additionalSleepingTime);

	    postRender = System.nanoTime() - preRender;

	    fps = (long) (1e9 / delta);
	    System.out.println(fps + " fps");

	    try {

		Thread.sleep(sleepingTime, additionalSleepingTime);

	    } catch (InterruptedException e) {

		e.printStackTrace();

	    }

	    delta = System.nanoTime() - preRender;

	}

}

Gedacht ist, genau 1e9 / 60 ns - postRender(Zeit die man zum Rendern benötigt) zu schlafen, um auf exakt 60 fps zu kommen. Leider bekomme ich durchgehend nur 58 fps.

Ich kann mir absolut nich erklären woran das liegt.
Zusätzlich: ab 1e9 / 60.6 ns bekomme ich konstant 62 fps ...

Ist mir absolut unverständlich ... kann mir das jemand erklären?
Danke,

-Luk10-
 
Zuletzt bearbeitet:

Cola_Colin

Top Contributor
Das "Problem" hatte ich auch mal, die Ursache liegt hier:

Java:
    public static void sleep(long millis, int nanos)
    throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
            millis++;
        }

        sleep(millis);
    }

Das ist die sleep-Methode, die du da aufrufst. Die rundet die nanos und arbeitet dann auch nur auf die ms genau. Keine Ahnung, ob es eine Plattform gibt, auf der die genauer arbeitet. Auf die ns genau ist selbst der Computer nicht so ohne weiteres.

Ich habe mich bei meinem eigenen Projekt dann mit etwas über 60 fps oder so zufrieden gegen. Um genau 60 zu erreichen könnte man wohl soetwas machen wie abwechselnd sleep mit 16 und 17 ms im richtigen Verhältnis aufzurufen. Viel hin und her für nichts im Endeffekt...
 

Luk10

Top Contributor
Danke für deine Antwort!

/facepalm Sehr sinnig, das dann in ns angeben zu können wenn es dann eh wieder auf ms gerundet wird.
Nehme dann wohl auch die 62 fps, anstatt von 58 bzw. (viel) mehr Aufwand.

-Luk10-
 

Neue Themen


Oben