Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 21, 2024 17:19

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mo Sep 30, 2002 08:36 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 13, 2002 18:26
Beiträge: 42
Wohnort: Stuttgart
wie löse ich das am besten? wenn ich z.b. eine CPU 500Mhz und eine CPU 1.5Ghz habe soll das Spiel gleichschnell ablaufen, ich mein damit dass bei 1000fps das spiel gleichschnell läuft wie bei 10fps, nur dass es bei den 1000fps flüssig is und bei den 10fps mehr oder weniger ruckelnd...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 30, 2002 08:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ähm...................?

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 30, 2002 10:50 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
Nun, Du mußt einfach die Differenz zwischen den Bildern errechnen und dann auf die Geschwindigkeit bringen. So läuft dann auf allen Rechnen alles mit der gleichen Geschwindigkeit. Momentan haben wir hierfür kein Tutorial, ich verweise daher auf eines für D3D, welches jedoch leicht auf OpenGL übertragbar sein sollte ;)

<a href='http://www.neobrothers.de' target='_blank'>www.neobrothers.de</a>

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 30, 2002 11:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich habs ungefähr so gelöst :

[01] Momentane Zeit (besser CPU-Ticks via QueryPerformanceCounter) speichern (T1)
[02] Komplette Szene zeichnen
[03] Die Zeit wieder abfragen und Speichern. (T2)
[04] T3 := T2-T1 -> Daraus ergibt sich die fürs Rendern des Bildes benötigte Zeit

Die Zeit T3 muss nun in einen Zeitfaktor umgewandelt werden. Ich hab das so gelöst :

Wenn der Rechner 10ms (Normwert) zum Rendern des Bildes braucht, bewegt sich der Spieler um 0.1 Einheiten -> Daraus folgt, das wenn der Rechner nun also halb so schnell ist (sprich 20ms zum Rendern braucht), bekomme ich nen Zeitfaktor von 20ms/10ms = 2.

Diesen Faktor speichere ich dann ab und benutze in für die Spielerbewegung.

Kleines Beispiel :
-Rechner A braucht 5ms zum Rendern der Szene, dadurch bewegt sich der Spieler (bei gedrückter Taste) also 5ms/10ms*0.1 Einheiten = 0.05 Einheiten.
-Rechner B braucht 10ms zum Rendern der Szene, dadurch bewegt sich der Spieler (bei gedrückter Taste) also 10ms/10ms*0.1 Einheiten = 0.1 Einheiten.
-Rechner C braucht 50ms zum Rendern der Szene, dadurch bewegt sich der Spieler (bei gedrückter Taste) also 50ms/10ms*0.1 Einheiten = 1 Einheit.

Hoffe das war anschaulich erklärt...vielleicht ringe ich mich mal dazu durch zu dem Thema ein Tut zu schreiben, obwohl die Materie relativ einfach ist...

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 30, 2002 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Es geht im Prinzip ganz einfach:

Zuerst die aktuelle Zeit nehmen.
Dann Deine Szene Rednern, Objekte bewegen, scripts ausführen, ...
Dann solange die Zeit nehmen, bis mindestens x-mns vergangen sind.

Dadurch setzt Du allerdings Deine Framerate auch auf ein gewisses Maß runter.

Andere Mglichkeit wäre, die Zeit zu nehmen und wenn mindestes x-ms vergangen sind, deine Objekte usw. zu bewegen. Wenn nicht, wieder die aktuelle Szene Rednern. Damit begrenst Du Deine FPS nicht und bist dennoch Zeit-Abhängig.

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 30, 2002 13:49 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Bei Simulationen gibts noch ein paar andere Wege... besonders wenn simulierte Reibung etc. ins Spiel kommt, kann es schon mal problematisch werden, wenn die Rechner untershciedlich schnell sind, da die Simulation dann je nach gewählten Formeln u.U. unterschiedliche Geschwindigkeiten errechnet... Dann empfiehlt es sich einen Extra Thread zu starten, der die Simulation übernimmt und die Objekte meinetwegen alle 20stel Sekunde aktualisiert. Der Renderer muss dann immer zwischen den Positionen/ Drehungen der Objekte interpolieren, aber das dürfte kein Problem sein. So bleibt das Spiel auf allen Rechnern gleich schnell, es sei denn der Rechner ist gar zu langsam für den Sim Thread... Das sollte dieser dann aber auch feststellen können... Das ganze eigent sich auch prima für Netzwerkspiele... Wenn ich mal lust hab, und interesse besteht, kann ich das ja mal etwas genauer beschreiben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 30, 2002 21:53 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 13, 2002 18:26
Beiträge: 42
Wohnort: Stuttgart
datt wär echt prima... hats irgendwo bestimmte artikel und tuts dazu evtl? :) vermutlich weniger was?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 30, 2002 21:55 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
nein ich denke nicht, dass man da allzuviel zu findet... aber ich kann ja demnächst mal etwas genauer beschreiben wie das läuft. kann aber etwa sdauern hab derzeit einiges am hut.


Zuletzt geändert von Delphic am Do Jul 09, 2009 17:35, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 02, 2002 22:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 13, 2002 18:26
Beiträge: 42
Wohnort: Stuttgart
Ich frag einfach nochmal *g*...
Angenommen ich habe eine OpenGL Szene die eine Isometrische Karte anzeigt. Der User hat die Möglichkeit mit den Tasten auf dieser hin und herzuscrollen oder mit dem Mausrad rein und rauszuzoomen:

Code:
  1.  
  2.  
  3. procedure TMainForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  4.  
  5. var
  6.  
  7.  &nbsp;[...]
  8.  
  9. begin
  10.  
  11.  &nbsp;[...]
  12.  
  13.  &nbsp;(*****************)
  14.  
  15.  &nbsp;(*RENDERVORGANG*)
  16.  
  17.  &nbsp;(*****************)
  18.  
  19.  &nbsp;glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  20.  
  21.  &nbsp;glLoadIdentity;
  22.  
  23.  
  24.  
  25.  &nbsp;//Rendert die Map
  26.  
  27.  &nbsp;RenderMap;
  28.  
  29.  
  30.  
  31.  &nbsp;glColor3f(1.0,1.0,1.0);
  32.  
  33.  
  34.  
  35.  &nbsp;//eigene funktion (nicht beachten)
  36.  
  37.  &nbsp;glPrint2D(2dfont, pchar('Z: '+floattostrf(wz,FFNUMBER,2,2)),0,0);
  38.  
  39.  
  40.  
  41.  &nbsp;if (Hi(GetAsyncKeyState(vk_left))) = 128 then wx:=wx+0.01;
  42.  
  43.  &nbsp;if (Hi(GetAsyncKeyState(vk_right)))= 128 then wx:=wx-0.01;
  44.  
  45.  &nbsp;if (Hi(GetAsyncKeyState(vk_up))) &nbsp; = 128 then begin wy:=wy-0.01; wz:=wz+0.01;end;
  46.  
  47.  &nbsp;if (Hi(GetAsyncKeyState(vk_down))) = 128 then begin wy:=wy+0.01; wz:=wz-0.01;end;
  48.  
  49.  (*************************)
  50.  
  51.  (*************************)
  52.  
  53.  (*************************)
  54.  
  55.  
  56.  
  57.  &nbsp;if myShowFPS then
  58.  
  59.  &nbsp;begin
  60.  
  61.  &nbsp; &nbsp;Inc(fps);
  62.  
  63.  &nbsp; &nbsp;if gt-st>=1000 then
  64.  
  65.  &nbsp; &nbsp;begin
  66.  
  67.  &nbsp; &nbsp; &nbsp;MainForm.Caption:=myTitle+Format(' - FPS: %f', [fps/(gt-st)*1000]);
  68.  
  69.  &nbsp; &nbsp; &nbsp;fps:=0;
  70.  
  71.  &nbsp; &nbsp; &nbsp;st:=gt;
  72.  
  73.  &nbsp; &nbsp;end;
  74.  
  75.  &nbsp;end;
  76.  
  77.  &nbsp;SwapBuffers(Canvas.Handle);
  78.  
  79. end;
  80.  
  81.  


Je höher die CPU und Grafikkarten Leistung, desto schneller kann man durch die Map scrollen. Genau das will ich nicht. Ich will dass immer gleichschnell gescrollt werden kann (so dass es z.b. netzwerkfähig wäre), also unabhängig von den fps. wie löse ich das nun? ist wichtig :( würde ich es über einen TTimer machen wärs anfängerhaft und da er sehr langsam ist auch sinnlos... bitte wenn ihr was wisst und vorschlagt, mit code schnipsel wenns geht :/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 02, 2002 22:57 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Code:
  1. wx:=wx+0.01;

würde ich wie folgt abändern:
Code:
  1.  
  2.  
  3. wx := wx + MaxBewegungIn1Sec * Framedauer in s
  4.  
  5.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 02, 2002 23:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 20:27
Beiträge: 479
Wohnort: Bremen
das aller aller Einfachste wäre folgendes:

wx:=wx+0.01*FPSbasis / FPS;

FPS ist das was du misst, FPSbasis ist eine Konstante z.B 30.

D.h. der Faktor (k = FPSbasis / FPScurrent) mit dem du multiplizierst ist für alle aktuellen Frameraten die größer als die Baisis-Framerate sind, kleiner 0 und für alle die kleiner sind als FPSbasis größer 0 - damit scrollst du immer gleich schnell.

aber wie gesagt, es ist die einfachste und damit nicht unbeding die Beste. (ich sag nur Division durch Null!)

-lith

_________________
Selber Denken macht klug!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 03, 2002 09:38 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 13, 2002 18:26
Beiträge: 42
Wohnort: Stuttgart
1. is damit garantiert dass auch auf lahmen rechnern, die weniger FPS als meine FPS grenze (z.b. 70) haben, gleich schnell scrollen, nur eben nicht mehr flüssig?

2. muss ich die FPS im prinzip begrenzen, oder?
Code:
  1.  
  2.  
  3. if myShowFPS then
  4.  
  5. begin
  6.  
  7.  &nbsp;if CurrentFPS<FPSBASIS then Inc(CurrentFPS);
  8.  
  9.  &nbsp;[...]
  10.  
  11. end;
  12.  
  13.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 03, 2002 09:50 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 13, 2002 18:26
Beiträge: 42
Wohnort: Stuttgart
Code:
  1.  
  2.  
  3. const
  4.  
  5.  SCROLLSTEP = 0.01;
  6.  
  7.  FPSBASIS = 30;
  8.  
  9.  
  10.  
  11. [...]
  12.  
  13.  
  14.  
  15. k:=(FPSBASIS/CurrentFPS);
  16.  
  17.  
  18.  
  19. if (Hi(GetAsyncKeyState(vk_left))) = 128 then wx:=wx+scrollstep*k;
  20.  
  21. if (Hi(GetAsyncKeyState(vk_right))) = 128 then wx:=wx-scrollstep*k;
  22.  
  23. if (Hi(GetAsyncKeyState(vk_up))) = 128 then begin wy:=wy-scrollstep*k; wz:=wz+scrollstep*k;end;
  24.  
  25. if (Hi(GetAsyncKeyState(vk_down))) = 128 then &nbsp;begin wy:=wy+scrollstep*k; wz:=wz-scrollstep*k;end;
  26.  
  27.  


funzt nicht wirklich ... :/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 03, 2002 22:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 20:27
Beiträge: 479
Wohnort: Bremen
sollte aber funzen... vorausgesetzt currentFps enthält wirklich die aktuellen frames pro sekunde.

d.h. wenn du die fps auf deinem Formular ausgibst musst du sie auch als currentFps speichern, damit sie für die Scroll- und Bewegungsberechnungen zur verfügung stehen.

Code:
  1.  
  2.  
  3. if myShowFPS then
  4.  
  5.  &nbsp;begin
  6.  
  7.  &nbsp; &nbsp;Inc(fps);
  8.  
  9.  &nbsp; &nbsp;if gt-st>=1000 then
  10.  
  11.  &nbsp; &nbsp;begin
  12.  
  13.  &nbsp; &nbsp; &nbsp;MainForm.Caption:=myTitle+Format(' - FPS: %f', [fps/(gt-st)*1000]);
  14.  
  15.  &nbsp; &nbsp; &nbsp;currentFPS := fps/(gt-st)*1000;
  16.  
  17.  &nbsp; &nbsp; &nbsp;fps:=0;
  18.  
  19.  &nbsp; &nbsp; &nbsp;st:=gt;
  20.  
  21.  &nbsp; &nbsp;end;
  22.  
  23.  &nbsp;end;
  24.  
  25.  


Außerdem solltest du currentFps mit 1 initialisieren um einen DivisionZero-Error am Anfang zu vermeiden.

-lith

_________________
Selber Denken macht klug!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 09, 2002 15:35 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 13, 2002 18:26
Beiträge: 42
Wohnort: Stuttgart
Ok ich muss jetzt nochmal hier "nerven".. aber das...
Code:
  1.  
  2.  
  3. k:=FPSBasis/CurrentFPS;
  4.  
  5.  

... kann man nur z.b. für scrollen verwenden, oder?
also wenn ich den faktor k z.b. bei einem rotierenden objekt benutze, dann dreht es sich abgehackt:

Code:
  1.  
  2.  
  3.  &nbsp;[...]
  4.  
  5.  &nbsp;rot:=rot+0.5;
  6.  
  7.  
  8.  
  9.  &nbsp;glRotatef(rot*k,0,0,0.1);
  10.  
  11.  &nbsp;glBegin(GL_QUADS);
  12.  
  13.  &nbsp; &nbsp;[...]
  14.  
  15.  &nbsp;glEnd;
  16.  
  17.  &nbsp;[...]
  18.  
  19.  


deshalb meine frage: was für ne möglichkeit gibts um bei jeder CurrentFPS eine gleichmäßige Rotation zu erreichen? Kann man nicht irgendwie sagen (dann würde man sich auch das ganze mit dem faktor k sparen), dass man nur RenderScene ausführen soll, wenn die CurrentFPS<=FPSBasis ist oder so? Das mit dem Faktor k kannst ja für netzwerkspiele nicht benutzen... was meint ihr?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.022s | 17 Queries | GZIP : On ]