# fps - Frames per Second? - Definition?



## milanwb (6. Jan 2007)

Hallo,

bei allen Spielen hört man etwas von fps, oder Frames per Second - Ich habe eien ungefähre Ahnung davon was genau das bedeutet, aber was ist es genau?

z.B.:

Wenn ich ein Spiel schreibe, habe ich ja eine Schleife, die alle sagen wir 100 ms durchläuft. Dort wird ja mein Fenster dann auch neugezeichnet - Wären das dann 10 fps?

Und wie funktioniert dann z.B. ein Jumb&Run Spiel mit einem Spielcharakter und Gegner?
Wenn der Spieler dann die Pfeiltasten benutzt um die Person zu steuern wird dann eine Variabel von 0 auf die Geschwindigkeit gesetzt und das aktualisieren wird der Schleife überlassen:



```
public void beiTastendruck() {

spielerGeschwindigkeit = 5; // Setze die Geschwindigkeit auf 5

}


public void beiLoslassen() {

spielerGeschwindigkeit = 0; // Beim Loslassen

}

public void run() {

while (true) {

spielerPos += spielerGeschwindigkeit;
// Hier wird halt gezeichnet
repaint();
sleep (100);

}


}
```



 oder sollte man eine eigene Funktionen bauen, die unabhängig von der Schleife die Person bewegt? 



```
public void beiTastendruck() {

spielerPos += 5;
// Zeichnen lassen...
repaint();

}
```

Das wärs erstmal von mir 
Wäre über Anregungen sehr dankbar!

Grüße

Michael


----------



## Wildcard (6. Jan 2007)

Das sind dann weniger als 10fps weil der eigentliche Zeichenvorgang mehr als 0ms in Anspruch nimmt.


> oder sollte man eine eigene Funktionen bauen, die unabhängig von der Schleife die Person bewegt?


Das geht nicht, da die Geschwindigkeit in der die KeyEvents kommen vom OS bestimmt werden und nicht konstant ist.


----------



## milanwb (6. Jan 2007)

> Das sind dann weniger als 10fps weil der eigentliche Zeichenvorgang mehr als 0ms in Anspruch nimmt.



Kann man das denn irgendwie messen? Weil bei vielen Spielen kann man sich die fps ja anzeigen lassen?


----------



## LoN_Nemesis (6. Jan 2007)

Sicher kann man das messen. Du machst dir eine Variable int frames oder so, die wird jedesmal um 1 hochgezählt wenn die Spielschleife komplett durchlaufen wurde. Dann gibst du einfach nach einer Sekunde aus, welchen Wert diese Variable hat und setzt sie auf 0.


----------



## milanwb (6. Jan 2007)

Stimmt - sehr simpel 

Danke dir!


Also noch mal zu meiner 2. Frage:

Also muss ich immer wenn der Benutzer z.B. die Pfeiltaste drückt eine Var speed auf einen Wert setzen und dann einfach bei Release diese wieder auf 0 setzen?


Danke für eure Mühe


----------



## LoN_Nemesis (6. Jan 2007)

```
public void beiTastendruck() {

     spielerPos += 5;
}
```

Ich mache das immer so. Natürlich kommen die KeyEvents nicht immer in perfekt gleichen Abständen, aber das ist vernachlässigbar und merkt man im Spiel gar nicht. Außerdem hast du das Problem genauso, wenn du bei Tastendruck eine Geschwindigkeit setzt und die Figur dann irgendwo anders bewegst.


----------



## milanwb (6. Jan 2007)

Und wie muss ich es machen, wenn ich möchte, dass sich die Figur solange die Taste gedrückt ist bewegt?

Dann müsste man doch eine extra Schleife bauen oder es tatsächlich mit in den Spielthread nehmen oder?


----------



## Wildcard (6. Jan 2007)

LoN_Nemesis hat gesagt.:
			
		

> Ich mache das immer so. Natürlich kommen die KeyEvents nicht immer in perfekt gleichen Abständen, aber das ist vernachlässigbar und merkt man im Spiel gar nicht. Außerdem hast du das Problem genauso, wenn du bei Tastendruck eine Geschwindigkeit setzt und die Figur dann irgendwo anders bewegst.


Erstens merkt man das sehr wohl und zweitens hat man das Problem eben nicht wenn man eine Geschwindigkeit setzt.
@milanbw
Lass einen Thread alle Bewegungen durchführen.
Am besten ein Interface mit einer move Methode für alle beweglichen Objekte die du dann aufrufst.
In move versetzen die Objekte dann ihre Position um ihren Bewegungsvektor.


----------



## LoN_Nemesis (6. Jan 2007)

Und dieser Thread der alle Objekte bewegt wird wohl irgendwo ein .sleep haben, oder? Da kannst du genauso wenig garantieren, dass genau diese Zeit gewartet wird, weil die Threads auch von OS gemanaged werden.

Das einzige Problem wenn man es so macht

```
public void beiTastendruck() {

     spielerPos += 5;
}
```

könnte der "Tippeffekt" sein, den man aus Textverarbeitungsprogrammen kennt... dort ist er allerdings gerade erwünscht. Also man tippt eine Taste an, und zunächst kommt der Buchstabe nur einmal, wenn man dann weiter gedrückt hält, dann wiederholt er sich in schneller Folge ganz oft.


----------



## milanwb (6. Jan 2007)

Ich denke der Tippeffekt könnte hier böse enden!
Also werd ich es so machen, dass ich einen Thread alles machen lasse - wär ja schade drum wenn viele Threads wenig machen, was ein Thread alles alleine kann - wir wollen den armen ja nicht unterfordern :-D


----------



## Wildcard (6. Jan 2007)

LoN_Nemesis hat gesagt.:
			
		

> Das einzige Problem wenn man es so machtkönnte der "Tippeffekt" sein, den man aus Textverarbeitungsprogrammen kennt... dort ist er allerdings gerade erwünscht.


Von eben diesem rede ich ja  :wink: 
Und glaub mir, das merkt der Benutzer sehr wohl


----------



## LoN_Nemesis (6. Jan 2007)

Ok klar das merkt man auf jeden Fall. Bei manchen Spielen ist das egal, aber bei den meisten nicht, da gebe ich dir recht. Ich dachte du meinst irgendwelche Verzögerungen im 1 ms Bereich oder so.


----------

