Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

xyn

Frischling

  • »xyn« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Hannover

Beruf: Webentwickler

  • Private Nachricht senden

1

14.09.2011, 22:46

[C++] logische Framerate (konstante Geschwindigkeit)

Hey Community,

da ich mich an die Spielentwicklung ranwagen möchte (zurzeit Webentwickler, beruflich) und jedes einzelne wichtige Konzept in diesem Bereich verinnerlichen will, habe ich zur konstanten Geschwindigkeit in einem Spiel noch eine kleine Verständnis-Frage.

Mir ist bewusst, dass ein bestimmter Programmablauf auf einem leistungsstarken Computer um ein vielfaches schneller abläuft, als auf einem Computer aus der Steinzeit. Aber wie genau wird diese Mechanik umgesetzt? Über eine kleine Aufklärung oder ein Beispiel würde ich mich sehr freuen.

xyn :huh:

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

2

14.09.2011, 23:12

Zeit messen und umrechnen oder warten?

xyn

Frischling

  • »xyn« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Hannover

Beruf: Webentwickler

  • Private Nachricht senden

3

15.09.2011, 23:35

Zeit messen und umrechnen oder warten?
Nachdem ich dein kleines aber doch feines Kommentar gelesen habe, habe ich mich noch in ein paar Seiten eingelesen. Ich lasse einen Timer laufen, der eine bestimmte Anzahl pro Sekunde aufgerufen wird. In dieser Zeit wird meine Logik abgearbeitet (Dies bedeutet meine Logik wird öfters aufgerufen). Erst nachdem durchlaufen der sog. Ticks, lasse ich meine Szene darstellen. Soweit so gut.

Somit gewährleiste ich eine konstante Geschwindigkeit auf allen unterschiedlichen Hardwarekonfiguration. Wie kann ich aber nun die Geschwindigkeit im Spiel selbst regulieren; diese kann im Spielablauf ja auch mal variieren (also nicht die Geschwindigkeit oder der Faktor wie oft die Logik aufgerufen wird). Ich brauche ja irgendein Faktor den ich mit einem Wert multipliziere, um zu wissen wie weit sich die Sprites oder sonstige bewegende Elemente bewegen , pro Frame(pixel).

Ich würde mich über ein paar Antworten zu Aufklärung freuen. Das Thema scheint simpel, ist aber im Endeffekt in der Ausführung (jedenfalls für Anfänger) nicht ganz trivial.

xyn

// Des Weiteren wundert es mich, wie es funktioniert wenn ich in meiner Logik abfrage (z.B.) ob ich von einem Gegner getroffen werde.

C-/C++-Quelltext

1
2
PSEUDOCODE 
if(hitByEnemy) healthpoints -= 10;



Somit würde doch im Normalfall dieser Aufruf pro Sekunde viel öfters aufgerufen. Wie handhabt man soetwas? Oder bin ich gerade nur etwas verwirrt... ist ja auch schon spät.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »xyn« (15.09.2011, 23:42)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

15.09.2011, 23:42

Wie gesagt: Zeit messen und umrechnen. Du musst wissen, wieviele Pixel sich das Objekte pro 1 Sekunde begewen soll, und dann die Laenge eines Frames messen. Ist simpler Dreisatz.

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

5

15.09.2011, 23:45

Such mal bei google nach Game Timer.

Muss mal gucken, ich poste dann morgen im Laufe des Tages ein Code Beispiel, falls du es dann noch brauchen solltest.

Schlagwörter sind aber:

C-/C++-Quelltext

1
2
3
QueryPerformanceCounter((LARGE_INTEGER*)&currentTime);
QueryPerformanceFrequency((LARGE_INTEGER*)&countsPerSec);
mSecondsperCount = 1.0 / (double) countsPerSec;


Es erfolgt zum Anfang erstmal ein Reset, wo du den Timer initialisierst.
Vor dem rendern deiner Scene holst du dir einen Snapshot (Tick) und berechnest ein Delta, also aktuelleZeit-vergangeneZei * mSecondsperCount .
Dieses Delta kannst du dann an deine Scenen geben und auf deine Bewegungen subtrahieren, addieren - wie du willst.
Dieser Wert wird auf langsamen Rechnern sehr groß sein und erzeugt ein ruckeln in den Bewegungen. Auf einem schnellen Rechner ist der Wert jedoch sehr klein und bewirkt eine flüssige Bewegung.

Gruß

Fb

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fireball« (16.09.2011, 00:01)


xyn

Frischling

  • »xyn« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Hannover

Beruf: Webentwickler

  • Private Nachricht senden

6

15.09.2011, 23:52

Ein Beispiel wäre natürlich sehr viel Wert. Somit könnte man sich die Umsetzung etwas besser vorstellen. Ich danke euch schon einmal. Ich werde mal weiter zu diesem Thema recherchieren und eure Tipps probieren in die Tat umzusetzen.

Gute Nacht soweit.

xyn

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

16.09.2011, 06:49


(Link)

a und v_0 kennst Du, t misst Du ja mittlerweile ebenfalls, s(t) ist gesucht. Passt.

Wahlweise gibt es auch noch die beliebte instabile Methode:

Position_neu = Position_alt + (Zeit_aktueller_Frame - Zeit_letzter_Frame) / Vorgesehene_Zeit * Geschwindigkeit
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (16.09.2011, 06:55)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

8

16.09.2011, 07:46

@Blue: Du hast zweimal die gleiche Formel genannt, nur gilt die zweite fuer die Vereinfachung a(t)=0, d.h. die Objekt beschleunigen dort instantan und v(t) ist stueckweise konstant, in der anderen ist nur a'(t)=0, also a(t) ist stueckweise konstant. Von daher verstehe ich deine Unterscheidung nicht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

16.09.2011, 13:17

Ja, das stimmt natürlich in etwa.

Nur ist das zweite eben eine Berechnung basierend auf der Zeit, die seit dem letzten Frame vergangen ist und einer vorher festgelegten Frametime, wohingegen das erste eine Berechnung basierend auf der Zeit ist, die seit dem Beginn der Bewegung(sänderung) vergangen ist. Jedenfalls wollte ich darauf hinaus, hab mich da aber wohl etwas zu kurz gefasst. Jedenfalls besteht darin dann ein kleiner, aber numerisch interessanter Unterschied, der natürlich dennoch aus der jeweils identischen Grundformel hervor geht, jap.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

10

18.09.2011, 23:45

Noe, man brauch die Variablen ja nur entsprechend einsetzen. s(t)= Position_neu; s0= Position_alt; t= (Zeit_aktueller_Frame - Zeit_letzter_Frame) / Vorgesehene_Zeit; v= Geschwindigkeit und a= 0. Wo ist da der Unterschied?

Werbeanzeige