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?
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"
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.
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?
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
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.
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 network • my 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
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.