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

Aktuelle Zeit: Di Mai 14, 2024 20:20

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TimeBased Movement
BeitragVerfasst: Di Mai 01, 2012 21:08 
Offline
DGL Member

Registriert: Mo Aug 23, 2010 19:45
Beiträge: 16
Programmiersprache: Delphi und noch mehr
Hallo Leute,

ich bastel gerade an einem GameOfLife das mit OpenGL dargestellt wird. Soweit passt auch alles. Nun möchte ich die nächsten Generationen immer in einem bestimmten Abstand berechnen lassen. Dazu rufe ich ja am besten die Funktion für die nächste Generation in der Renderroutine auf. Richtig?

Um die Abstände nun auf verschiedenen Rechnern gleich zu halten nutzt man ja TimeBased Movement. Meine Frage ist nun, da ich meine Renderroutine in einem Timer aufrufe, begrenze ich die Frames ja auf 20 FPS. Bräuchte ich da auch TBM oder kann ich dort einfach im Render eine Variable hochzählen und bei einem bestimmten Wert meine Funktion aufrufen?


Und dann hätte ich da noch ein anderes Problem. Ich zeige in einer Statusbar noch ein paar zusätzliche Informationen an (Generationszahl, Anzahl lebender Zellen, etc). Mein Zeichenhandle für OpenGL ist das komplette Formular. Nun verdeckt aber die Statusbar ein Teil des Formulars. Somit wird die unterste Zeile von der Statusbar überdeckt. Kann ich das irgendwie verhindern?


Vielen Dank schonmal für eure Hilfe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TimeBased Movement
BeitragVerfasst: Di Mai 01, 2012 23:45 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Müllermilchtrinker hat geschrieben:
Hallo Leute,

ich bastel gerade an einem GameOfLife das mit OpenGL dargestellt wird. Soweit passt auch alles. Nun möchte ich die nächsten Generationen immer in einem bestimmten Abstand berechnen lassen. Dazu rufe ich ja am besten die Funktion für die nächste Generation in der Renderroutine auf. Richtig?

Um die Abstände nun auf verschiedenen Rechnern gleich zu halten nutzt man ja TimeBased Movement. Meine Frage ist nun, da ich meine Renderroutine in einem Timer aufrufe, begrenze ich die Frames ja auf 20 FPS. Bräuchte ich da auch TBM oder kann ich dort einfach im Render eine Variable hochzählen und bei einem bestimmten Wert meine Funktion aufrufen?

IMHO ist es keine gute Idee die Berechnung im Render Teil zu machen. Das würde ich auslagern. Nichts desto trotz kannst du ja einfach einen Zähler mitlaufen lassen, der dir die Frametime ausrechnet. Ist evtl. auch hilfreich falls du mal von dem Timer weg willst oder du z.B. die einzelnen Iterationen des Algorythmus durchgehen willst.
Müllermilchtrinker hat geschrieben:
Und dann hätte ich da noch ein anderes Problem. Ich zeige in einer Statusbar noch ein paar zusätzliche Informationen an (Generationszahl, Anzahl lebender Zellen, etc). Mein Zeichenhandle für OpenGL ist das komplette Formular. Nun verdeckt aber die Statusbar ein Teil des Formulars. Somit wird die unterste Zeile von der Statusbar überdeckt. Kann ich das irgendwie verhindern?
Vielen Dank schonmal für eure Hilfe.

Ich klingt so als ob du mit Delphi programmierst. Da bin ich zwar schon was länger raus, aber ich denke du kannst das Handle doch auch von einem TPanel holen welches die ClientArea ausfüllt und nicht von der Statusbar verdeckt wird.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TimeBased Movement
BeitragVerfasst: Mi Mai 02, 2012 14:10 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Ich würde empfehlen, TimeBased Moevement grundsätzlich immer zu implementieren. Selbst wenn du einen Timer mit dem Intervall von - sagen wir mal 40 ms - nutzt, heißt das nicht, dass du dann auch eine Framerate von 1000 ms / (40 ms) = 25 fps hast. Ein Intervall von 40 ms heißt nämlich, dass mindestens 40 ms gewartet wird. Wenn der Computer nebenbei noch sehr beschäftigt ist (z.B. durch andere Prozesse), führt das dazu, dass du deutlich weniger als die 25 fps bekommst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TimeBased Movement
BeitragVerfasst: Do Mai 03, 2012 19:07 
Offline
DGL Member

Registriert: Mo Aug 23, 2010 19:45
Beiträge: 16
Programmiersprache: Delphi und noch mehr
OK, dann werde ich TBM einbinden. Muss man das dann so wie im Tutorial, dass den IdleHandler nutzt, einbinden, oder muss ich was beachten bei der Timervariante?

Und noch jemand eine Idee wegen meinem Statusbar Problem?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TimeBased Movement
BeitragVerfasst: Fr Mai 04, 2012 18:51 
Offline
DGL Member

Registriert: Do Apr 19, 2012 19:06
Beiträge: 4
Programmiersprache: Delphi 2010
Soweit ich dass verstanden habe sollte es eigentlich egal sein, wichtig ist die Zeit die zwischen deinen Aufrufen der Renderprozedur vergeht (ob nun Timer oder OnIdle). Berechne deine Zeit einfach am Anfang deines Timers
Code:
  1.  
  2.   currentTime        := GetTime; // QueryPerformanceCounter / QueryPerformanceFrequency
  3.   result             := currentTime - FLastTime;
  4.   FLastTime          := currentTime;
  5.  

result ist dann die Zeit die benötigt wurde für deinen Timer + Render code in Sekunden (z.B. 0,033 bei 30fps) (FLastTime mit GetTime initialisieren nicht vergessen bevor du deinen Timer aktivierst).
Du könntest aber auch OnIdle Rendern und trotzdem die FPS limitieren was aber mit etwas mehr Aufwand verbunden ist (dafür habe ich mir extra eine eigene Klasse geschrieben).


damadmax hat geschrieben:
Ich klingt so als ob du mit Delphi programmierst. Da bin ich zwar schon was länger raus, aber ich denke du kannst das Handle doch auch von einem TPanel holen welches die ClientArea ausfüllt und nicht von der Statusbar verdeckt wird.

Wie "damadmax" schon sagte, setzte einfach ein TPanel auf deine Form mit Align = alClient und benutze CreateRenderingContext(GetDC(TPanel.Handle), ...) dann zeichnet OpenGL nur im Bereich des TPanels und nicht vergessen glViewPort mit der Größe deines TPanels zu füttern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TimeBased Movement
BeitragVerfasst: Fr Mai 04, 2012 19:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, wenn man nicht exakt X fps erreichen will, besteht so'ne limitierung doch aus nichts weiter als einer Prüfung, ob man gerade über X fps ist, und wenn ja sleept man halt für ne millisekunde. Und ne exakte Limitierung ist bei TBM auch nicht sinnvoll. Denn um die CPU/GPU-Last zu reduzieren reicht ne ungefähre limitierung vollkommen aus.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.095s | 17 Queries | GZIP : On ]