Domanda

Sto cercando di mantenere il mio gioco a 60fps, ma sto ottenendo strani risultati dal mio codice come "2-8000 fps" Perché non è questo soggiorno a 60?

public static void main(String[] args) {

        joglplat m = new joglplat();
        while(true){
            long startTime = System.nanoTime() / 1000000;
                try
            {
                //                 123456: 6 zeros => 16ms
                long nsToSleep = 16000000 - (System.nanoTime() - lastFrame);
                System.out.println("ns: " + nsToSleep);
                lastFrame = System.nanoTime();

                if(nsToSleep > 0)
                {
                   System.out.println("ns2: " + (nsToSleep/1000));
                   System.out.println("ns3: " + (nsToSleep%1000));
                   Thread.sleep(nsToSleep/16000000, (int)(nsToSleep % 1000));
                }
                else
                {
                   Thread.yield();  // Only necessary if you want to guarantee that
                                    // the thread yields the CPU between every frame
                }

            }

            catch(Exception e){
                e.printStackTrace();
            }

            m.controls();
            m.update();
            m.repaint();
            System.out.println("framerate: " + (System.nanoTime() / 1000000  - startTime));
        }
    }
È stato utile?

Soluzione

L'output è il numero di secondi il programma ha funzionato per non framerate. Si dovrebbe essere dividendo il numero di telaio (che non stanno raccogliendo) dal percorso totale di tempo.

Per ottenere il conteggio dei fotogrammi, è sufficiente aggiungere una nuova variabile al di fuori del vostro ciclo di gioco, ed incrementarlo ogni volta attraverso ...

public static void main(String[] args) {
    long frames = 0;
    joglplat m = new joglplat();
    while(true){
        frames++;
        // other code here
        System.out.println("framerate: " + ((System.nanoTime() / 1000000  - startTime) / frames ) );
    }
}

Si noti, tuttavia, che questo vi darà il framerate medio durante l'intera esecuzione del programma. Altre due opzioni che si hanno sono per ottenere il framerate istantanea, e il framerate media degli ultimi fotogrammi N.

Tutti gli stili in un unico (non testato / non compilato, quindi potrebbe avere alcuni errori, ma dovrebbe iniziare nella giusta direzione):

public static void main(String[] args) {
    long startTime = System.nanoTime();
    long lastFrameTime = startTime;
    long frames = 0;
    int framesToAverage = 10;
    long[] frameTimes = new long[framesToAverage];
    joglplat m = new joglplat();
    while(true){
        // logic here
        long currentFrameDuration = System.nanoTime() - lastFrame;
        lastFrameTime = System.nanoTime();
        long instantFramerate = currentFrameDuration / 1000000;
        int currentFrameIndex = frames % frameTimes.length;
        frameTimes[currentFrameIndex] = currentFrameDuration;
        frames++;
        long averageFramerate = ( ( lastFrameTime - startTime) / frames ) / 1000000;
        long instantFramerate = currentFrameDuration / 1000000;
        if( frames > frameTimes.length ) { // if it isn't, we don't have enough data yet
            int firstFrameIndex = currentFrameIndex + 1;
            if( firstFrameIndex > frameTimes.length ) {
                firstFrameIndex = 0;
            }
            long averageFrameratePerN = ( ( frameTimes[currentFrameIndex] - frameTimes[firstFrameindex] ) / frameTimes.length ) / 1000000;
        }

        // yield/sleep here
    }
}

Altri suggerimenti

Il mio sospetto è che questo è causato dalla inesattezza dei Thread.sleep ():

  

causa il thread attualmente in esecuzione   a dormire (esecuzione cessate) per la   numero specificato di millisecondi più   il numero specificato di nanosecondi,   soggetto alla precisione e accuratezza   di timer di sistema e pianificatori. Il   filo non perde la proprietà di qualsiasi   monitor.

C'è qualche motivo per cui si deve tenere il framerate giù come questo? Forse si può spiegare più pienamente ciò che si sta cercando di realizzare?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top