Erstmal danke für die tollen Tutorials und v.a. für die DGLOpenGL.pas Ich bin gerade dabei, eine 2D Delphi Anwendung zu schreiben, in der man Polygone verschieben, drehen und den Viewport zoomen können soll.
Leider hab ich auf meinem Rechner (2400+/1GB/TNT1,16MB,PCI/WIN2K,D7) Performanceprobleme beim Ausführen meines grundlegenden Basissystems (der unten genannte Record TContour hat dabei ~400 Points). Ich vermute also, dass ich irgendwas falsch angehe
Die bisherige Struktur sieht so aus:
Ich habe eine Klasse DGLViewport, die die Renderprocedure beinhaltet und ein dynamisches Array Items, welches Records vom Typ TEntity enthält:
Code:
TPolyPoint3D=record
X,Y,Z,Bulge:Single;
end;
TDimensionsf=record
XMin,XMax,YMin,YMax,ZMin,ZMax:Single;
end;
TContour=record
Points:array[0..2500]of TPolyPoint3D;
Dimensions:TDimensionsf;
Count:Smallint;
end;
TColor3B=array[0..2]ofShortint;
TEntity=record
Contour:TContour;
Border:Boolean;
BorderColor:TColor3B;
FillColor:TColor3B;
Handle:integer;
end;
Die Renderprocedure wird von Application.OnIdle aufgerufen und sieht folgendermaßen aus:
Code:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Das Projekt habe ich jetzt mal nicht angehängt, weil es die msxml2_tlb (msxml6) braucht und ich nicht sicher bin, ob ihr die habt...
Hat jemand ne Idee, wie ich das ganze etwas tunen könnte?
Hab mittlerweile rausgefunden, dass ich mir die TranslateContour wohl sparen kann und einfach dem TEntity X,Y,Z hinzufügen kann, welches ich mit glTranslatef anwende Trotzdem bin ich offen für weitere Tweaks
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Gibt noch die übliche Möglichkeiten à la Displaylisten. Dann solltest du versuchen glBegin() und glEnd zusparen indem du die entsprechenden Objekte mit dem gleichen GLMode zusammenfasst.
Hab gelesen, dass Displaylisten wohl nicht so schnell erzeugt werden sollen. Wenn ich dann eine Echtzeitansicht während der Drehung eines Objektes haben möchte, sollte ich es dann außerhalb der Liste zeichnen, oder?
Wg. Zusammenfassen: Kann ich glLoadName und glTranslatef innerhalb eines glBegin/End Blocks verwenden?
Edit:
Nochwas:
Eigentlich isses ja Verschwendung, wenn ich Render bei Application.OnIdle aufrufe. Würde ja reichen, wenn ich es OnMouseMove und OnFormShow/Resize aufrufe.
Allerdings hab ich noch nicht ganz geblickt, wo ich das ganze das erste Mal aufrufen soll, damit ich überhaupt was sehe, wenn ich die Anwendung starte.
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Ok, das mit glBegin-glEnd geht nicht, da glLoadname dadrinnen nicht aufgerufen werden darf.
Wegen der Displaylisten:
Die erzeugst du nur einmal und rufst dann einfach die Displaylisten ab, daher werden sie nur einmal erstellt.
Das mit dem Translate und Rotate ist kein Problem solange deine Strukturen entsprechend aufgeteilt sind.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
So. Als erstes einmal. Habe ich das Richtig gelesen? TNT1? Erwarte bitte keine Wunder von dieser Karte. Selbst bei 400 Flächen dürftest du damit schon hart am Limit sein. Bei einer 2400+ Maschiene hätte ich aber keine TNT 1 erwartet.
DL: Auf dieser Karte sind DLs genau so schnell wie VertexArrays (Clientseitig) oder das Rendern in einer Schleife. DLs entfalten sich erst richtig, wenn die Karte in der Lage ist die Vertexdaten im Speicher abzulegen. Und die TNT ist es nicht. Allerdings sollte dein Programm auf neueren Karten laufen bietet sich es schon an. Dann aber bitte darauf achten, dass du nur dein Polygon in die DL Packst. Das Skalieren, Rotieren, Farbe etc sollte alles außerhalb passieren.
Wobei wir auch schon beim Nächsten wären. Weißt du, dass GL_POLYGON recht langsam ist und nur konvexe Polygone kann? Solltet du also auch Polygone haben die Konkav sind so musst du diese Tessletieren. Also vorab in einzelne Dreiecke zerlegen. Dabei könnte gluTessBeginPolygon für dich ganz interessant werden.
Sonst kann i0n0s nur zustimmen. Lass so viel wie möglich weg. Allerdings ist der Code schon sehr schmal und ich denke, dass man daran kaum noch etwas verändern kann. Bis auf die Sache mit den Polygon evtl bringt das schon ein bisschen. Aber sonst denke ich es wäre besser du findest dich damit ab, dass die Karte einfach nicht zu mehr im Stande sein wird. Für mich sieht der Code nämlich schon reichlich schmal aus.
Zeichnen auf verlangen. Du kannst nicht nur dann zeichnen, wenn du die Maus betätigst. Benutze dafür das OnPaint des Formulars. Sobald ein anderes Fenster über dein Fenster malt wird so automatisch neu gerendert. Wenn du jetzt die Maus bewegst oder sonst etwas machst genügt es, wenn du dann Form.Repaint aufrufst damit neu gerendert wird. Und OnIdle kannst du dann komplett weglassen.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Für die Frage was ein Befehl kann ("Darf man xyz in glBegin aufrufen") gibts das DGL-Wiki. Einfach bei den Befehlen mal die Fehlermeldungen angucken, oder aber glBegin selbst. Da steht auch noch was dazu.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: 0 Mitglieder und 11 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.