[C/C++] Frage zur OpenGL-Darstellungsgeschwindigkeit:

LostHero

Admiral Special
Mitglied seit
07.08.2006
Beiträge
1.597
Renomée
39
Standort
Osnabrück
Hallo Forum,

ich arbeite seit einiger Zeit an einem Bildschirmschoner für die Firmenrechner meines Vaters welcher in c/c++ geschrieben ist.
Für die darzustellende Animation benutze ich OpenGL welches ich derzeit mit hilfe der NeHe Tutorials lerne (also noch alles andere als ein Profi bin ;)).

Soweit so gut, nun zu meinen Fragen:

Ich habe mittlerweile eine sehr umfangreiche Animation gebaut die soweit auch Fehlerfrei läuft (mangels kenntnis darüber wie ich Models die ich mit blender erzeuge in einem c/c++ programm einlese/darstellen kann, sind die objekte alle von hand geschrieben... ~1200 einzelne punkte).

Mein Problem nun ist, dass die selbe Animation auf unterschiedlichen Rechnern unterschiedlich schnell abläuft. Mit anderen Worten:
auf meinem Notebook welches kaum rechenleistung hat läuft die animation so wie ich sie mir vorstelle, auf meinem Desktop PC jedoch rennt die mit Hyperspeed (ebenso auf den mühlen meines Vaters für die das Programm gedacht ist).

Da das selbe Verhalten auch bei den NeHe Tutorial beispielprogrammen auftritt, vermute ich mal, dass es daran liegt, dass sämtliche berechnungen in einer Schleife in der Draw-funktion von OpenGL gemacht werden, also je schneller der Computer, desto schneller läuft auch die Schleife.

Wie kann ich dies umgehen? Das es irgendwie geht ist mir klar, sonst würden Spiele auch unterschiedlich schnell laufen (sobald eine mindest FPSzahl erreicht/überschritten ist).



Und die 2. Frage hat vermutlich die selbe Ursache:
Die Szene besteht aus 3 größeren Objekten welche jeweils etwa aus 400 Punkten bestehen sowie einem Schriftzug die Zufallsgesteuert über den Bildschirm wandern.
Und nach X Sekunden soll sich entweder die Animationsart ändern, oder der Morphingprozess eingeleitet werden, in dem sich die Objekte in andere Objekte verwandeln.
Auch das funktioniert wunderbar, nur eben unterschiedlich schnell... so werden aus X = 5 sekunden auf dem Notebook auch tatsächlich etwa 5 sekunden, während auf meinem Desktop PC die X = 5 zu gefühlten X = 0,05 sekunden werden ^^.

Derzeit ermittel ich die zeit mit hilfe von 2 zeitabgleichen (also systemzeit a minus systemzeit b = vergangene zeit).
Da mir kein anderer Weg bekannt ist um nen "Timer" zu realisieren....



So das war jetzt ne kleine Wall of Text, ich hoffe hier gibt es den ein oder anderen OpenGL-Experten der mir weiterhelfen kann (und möchte ;)).
 
Mach mal die restlichen Tutorials von NeHe auch noch, in den späteren Lessons wird das Framework nämlich umgestellt, sodass Animationen auf allen Rechnern gleich schnell laufen. ;)
Grob zusammengefasst: Du musst messen, wieviel Zeit seit dem letzten Frame vergangen ist und deine Animation muss den nächsten Schritt aus dieser Zeit berechnen - wie in Physik Geschwindigkeit = Weg / Zeit.

Ach ja, die NeHe-Tutorials sind technisch ziemlich veraltet. Sie nutzen beispielsweise noch den Immediate Mode (glBegin/glEnd), der von OpenGL 3 schon gar nicht mehr voll unterstützt wird. Schau dir mal Vertex Buffer Objects an (kommt auch in irgendeiner Lesson vor).

Hier noch eine weitere gute Quelle wenn es um OpenGL geht: http://wiki.delphigl.com/index.php/Hauptseite
 
Meh das hasse ich am Programmieren immer am meisten, kaum hab ich was gelernt, ists schon wieder veraltet ^^.
Weißt du zufällig ab welcher Lesson das Framework umgestellt wird? Hänge momentan bei dem 25-30er Block (hab nach der Morphing-Lesson angefangen den Bildschirmschoner zu proggen, weil ich da "alles wusste" was ich dafür benötige ^^).

Aber habs fast befürchtet, dass es nicht eben so mit 1,2 Zeilen Code zu beheben ist hehe.
 
Zuletzt bearbeitet:
Lesson 32 müsste die erste mit dem neuen Framework sein.
So wild sind die Änderungen letztlich nicht. Das ganze Drumherum (Fenster erzeugen und verwalten, GL-Context erzeugen und mit dem Fenster-DC verknüpfen usw.) wird halt weggekapselt. Die Änderungen für zeitgesteuerte Animationen waren glaube ich überschaubar. Es erscheint nur soviel, weil halt noch vieles anderes mit geändert wurde.

Nochmal zum Thema veraltet: Der Immediate Mode funktioniert schon noch, da die Grafiktreiber ja auch OpenGL 1.x unterstützen. Aber State of the Art ist es nicht mehr - wie auch vieles anderes. Die Tutorials gehen bspw. wenig auf die Shaderprogrammierung ein, ohne die es heute aber nicht mehr geht.
Ich habe die letzten 6 Monate meine Diplomarbeit zum Thema Displacement Mapping geschrieben. Für den praktischen Teil wurde OpenGL genutzt. Als ich angefangen habe, hatte ich praktisch keinen Plan von OpenGL und hab mich auch erstmal durch die NeHe-Tutorials gegraben. Am Ende der Arbeit habe ich dann mit Dingen wie Transform Feedback, Shader Model 4.0, Geometry Shader usw. gearbeitet - Dinge, die kürzlich erst in den OpenGL-Standard aufgenommen wurden und zuvor nur Erweiterungen waren.
Der Übergang von dem OpenGL 1.x aus den Tutorials zum OpenGL 3.1, das ich am Ende eigentlich genutzt habe, war schon ziemlich heftig. Da liegen wirklich Welten dazwischen. Meist kann man zwar alte Vorgehensweisen mit neuen mischen, aber eben nicht immer.
 
Jo okay danke, werd mir das bei Gelegenheit dann mal reinziehen. Mit den Begin und End Blöcken muss das Prog dann halt leben, habe wie oben erwähnt ~1200 Punkte im 3D Raum von Hand geschrieben (und von hand Polygone draus gebaut).
Selbst unter androhung von Gewallt werd ich da nicht noch mal durchwuseln und das ändern hehehe.

Aber fürs nächste Projekt dann halt anders machen.

Wird in den späteren Lessons erklärt wie man Models in OpenGL einladen kann? Oder muss ich dafür nach anderen Tutorials suchen?
Ich hoffe mal, das die Codes der ganzen .3ds und co loader nicht wie ein Staatsgeheimnis gehütet werden...
Es ist deutlich angenehmer (und schneller) nen Model mit Blender zu erstellen als punkt für punkt von hand tippen zu müssen....


EDIT:
Okay sehe gerade, dass Lesson 31 "Modelloading" heißt, denke damit hat sich die Frage erübrigt :).

Fein fein die Änderung dass es auf allen CPUs gleich schnell läuft geht doch in 1,2 Zeilen ;).
Und ein weiterer netter Nebeneffekt ist, dass ich keine eigenen Timer mehr bauen muss sondern OpenGL nach der Zeit fragen kann, wusste ich auch nicht vorher.
 
Zuletzt bearbeitet:
Einige Lessons laden in der Tat Modelle aus Dateien. 3ds ist da allerdings nicht dabei, sondern nur ms3d, diverse andere binäre Formate und ein Textformat, welches obj sehr nahe kommt.
Für die Diplomarbeit habe ich mir einen kleinen obj-Loader geschrieben. Das ist nicht wirklich schwer, zumindest wenn man einige Dinge wie Materialien ignorieren kann. 3DS kann auf jeden Fall obj-Dateien erzeugen.

/Edit: Lesson 31 ist anscheinend grade die mit der ms3d-Datei.
 
Zurück
Oben Unten