Question

Je suis en train de garder mon jeu à 60fps, mais je suis d'obtenir des résultats étranges de mon code comme « 2-8000 fps » Pourquoi pas rester à 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));
        }
    }
Était-ce utile?

La solution

Votre sortie est le nombre de secondes que votre programme a pour exécuter, pas frameRate. Vous devez être divisant votre nombre d'images (que vous ne recueillez pas) par la course du temps total.

Pour obtenir le nombre d'images, il suffit d'ajouter une nouvelle variable en dehors de la boucle de jeu, et incrémenter chaque fois par ...

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 ) );
    }
}

Notez, cependant, que cela vous donnera le framerate moyen tout au long de l'exécution complète de votre programme. Deux autres options que vous avez doivent obtenir le framerate instantané, et le framerate moyen au cours des dernières images N.

Tous les styles dans un (non testé / décompilé, donc peut-être des erreurs, mais vous devriez aider à démarrer dans la bonne direction):

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
    }
}

Autres conseils

Je soupçonne que cela est causé par l'inexactitude des Thread.sleep ():

  

Causes le fil en cours d'exécution   dormir (exécution de cessez) pour la   nombre de millisecondes, plus   le nombre spécifié de nanosecondes,   sous réserve de la précision et l'exactitude   des temporisateurs du système et ordonnanceurs. le   fil ne perd pas la propriété de tout   moniteurs.

Y at-il des raisons pour lesquelles vous devez tenir le framerate comme ceci? Peut-être que vous pouvez expliquer plus en détail ce que vous essayez d'accomplir?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top