fps - Frames per Second? - Definition?

Status
Nicht offen für weitere Antworten.

milanwb

Aktives Mitglied
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:


Code:
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?


Code:
public void beiTastendruck() {

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

}

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

Grüße

Michael
 

Wildcard

Top Contributor
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.
 

LoN_Nemesis

Bekanntes Mitglied
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

Aktives Mitglied
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

Bekanntes Mitglied
Code:
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

Aktives Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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
Code:
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

Aktives Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben