![]() |
OpenGL Beschleunigungs Routinen oder Codeoptimierung
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo habe ein Programm in OpenGL geschrieben das 3D Koordinaten Punkte aus einer Datei ausliest und am Bildschirm wahlweise als Punktliste oder Linestrip usw. anzeigt.
Mein Problem ist nur dass das der Render vorgang beim Bewegen in der Punktwolke relativ lange dauert, d.h. es ist keine richtig Flüssige animation. Die Punkte werden beim Programmstart aus dem File in eine Stringliste kopiert, somit liegen sie im speicher d.h. das Programm muss auch nicht auf die Festplatte zugreifen. Es ist sozusagen das Grundgerüst für ein Visualisierungsprogramm. Danke für eure Bemühungen PS.: Weiss jemand wie ich *.TIF Dateien als Texturen in OpenGL verwenden kann. |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
wenn du die datei, aus der die punkte gelesen werden, auch noch mitschicken würdest, wäre ich dir sehr dankbar :wink:
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
![]() |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Liste der Anhänge anzeigen (Anzahl: 1)
:oops: Ok sorry
Um die Datei erfolgreich mit OpenGL zu laden musst du bitte in den Ländereinstellungen das Dezimal Trennzeichen von "," auf "." umstellen. Danke für deine Hilfe edit: Habe das falsche file hochgeladen ist nun korrigiert. :oops: |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
Delphi-Quellcode:
Sonst, solltest du uns etwas von dem Code schicken, um bessere Hilfe zu bekommen.
type T3dPunkt = array[0..2]of Single;
var Punkte : array of T3dPunkt; |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Ok danke erstmal, das projekt habe ist als anhang im ersten post von mir eingefügt.
Bin für jede weitere optimierung dankbar. |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zu der PointList Funktion:
Viel schneller wäre es wenn du es so machen würdest:
Delphi-Quellcode:
// in unit 2
uses ....,opengl,.....; var From2 : TForm2; _Mesh_Mode : Cardinal = GL_POINTS; implementation uses unit1; procedure TForm2.ComboBox1Change(Sender: TObject); begin case ComboBox1.ItemIndex of 0:_Mesh_Mode := GL_POINTS; 1:_Mesh_Mode := GL_LINES; 2:_Mesh_Mode := GL_LINE_STRIP; 3:_Mesh_Mode := GL_LINE_LOOP; 4:_Mesh_Mode := GL_TRIANGLES; 5:_Mesh_Mode := GL_TRIANGLE_STRIP; 6:_Mesh_Mode := GL_TRIANGLE_FAN; 7:_Mesh_Mode := GL_QUADS; 8:_Mesh_Mode := GL_QUAD_STRIP; 9:_Mesh_Mode := GL_POLYGON; end; end; // in unit1 procedure tform1.pointlist; var i: integer; begin glBegin(_Mesh_Mode); //(stringreplace(templist[1],'.',',',[rfReplaceAll])) for i:=0 to numofpoints do begin templist.DelimitedText:=finalpoint[i]; glcolor3f(r,g,b); glloadname(Punkt); //neu glvertex3f(tpointlist[i,1],tpointlist[i,2],tpointlist[i,0]); //glvertex3f(tpointlist[i,2],tpointlist[i,3],tpointlist[i,1]); //glvertex3f(strtofloat(templist[2]),strtofloat(templist[3]),strtofloat(templist[1])); end; glend; end; |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
wie du warscheinlich gesehen hast wollte ich das auch schon mit einem dynamischen array lösen.
danke für deinen vorschlag sieht echt super aus, bin selbst stundenlang davor gehock und habs einfach nicht geschafft. nochmal danke. |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
ein problem habe ich allerdings noch
irgendwie gibts da ein problem mit den zuweisungen der cardinal werte GL_POINTS
Delphi-Quellcode:
procedure TForm2.ComboBox1Change(Sender: TObject);
begin case ComboBox1.ItemIndex of 0:_Mesh_Mode := GL_POINTS; 1:_Mesh_Mode := GL_LINES; 2:_Mesh_Mode := GL_LINE_STRIP; 3:_Mesh_Mode := GL_LINE_LOOP; 4:_Mesh_Mode := GL_TRIANGLES; 5:_Mesh_Mode := GL_TRIANGLE_STRIP; 6:_Mesh_Mode := GL_TRIANGLE_FAN; 7:_Mesh_Mode := GL_QUADS; 8:_Mesh_Mode := GL_QUAD_STRIP; 9:_Mesh_Mode := GL_POLYGON; end; hatt jemand eine ahnung warum?? |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Welches Problemm ?? :gruebel:
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
also die fehlermeldung sieht folgendermassen aus.
[Error] Unit2.pas(66): E2003 Undeclared identifier: 'GL_POINTS' keine ahnung warum? |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Ja, das muss das Problemm sein. Du hast die erste Zeile meines Postings versehen.
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
sorry leute aber uses opengl hab ich drinnen, wenn ich die case abfrage entferne, funktioniert mein programm einwandfrei.
es muss irgend was anderes sein (keine ahnung). Danke für eure Hilfe |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Kommt der Fehler nur für GL_POINTS oder auch für GL_LINES, GL_LINE_STRIP, usw.?
Evtl. kannst du GL_POINTS durch 0 ersetzen, da dass IMHO der Wert ist, den die Konstante GL_POINTS repräsentiert. MfG Binärbaum |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
die fehlermeldung kommt auch für GL_Lines, GL_Linestrip usw.
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Du hast die unit opengl nicht eingebunden.
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
also nochmal,
wenn ich die unit opengl nicht eingebunden hätte würde das programm überhaupt nicht laufen. es ist aber so das mein programm funktioniert ohne besagter case schleife. delphi würde das programm nicht einmal compilieren wenn ich die opengl nicht eingebunden hätte. kann es daran liegen dass ich delphi2005 benutze ???, ein absturz hat mein lizenz file für delphi 7 beschädigt. |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Nur so als Hinweis: falls besagtes Programm aus mehreren Units besteht, muss in jede dieser Units, in der OpenGL (oder halt Konstanten wie GL_POINTS) benutzt wird, auch diese Unit eingebunden werden, unabhängig davon, ob es schon in einer anderen Unit in der uses-Klausel steht.
Anders kann ich mir das nicht erklären, da undefinierte Bezeichner bei solchen Konstanten fast immer bedeuten, dass die entsprechende Unit, in der die Konstante deklariert ist, nicht eingebunden ist. |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
danke jetzt ist alles klar,
das wusste ich noch nicht. ich hoffe es war nicht allzu mühsam für euch. Aber manchmal.. :stupid: :wall: danke für eure hilfe ich werde jetzt mal ein bisschen rumspielen. mal sehen wie schnell's läuft |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
habs nun fertig, läuft schon um 50% schneller.
Wenn ich aber eine Punktlist lade die 10MB gross ist, beginnts wieder zu ruckeln. Gibts eine geeignete vorgehensweise um mit solchen punktmengen zu hantieren. Danke |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Evtl. helfen dir hier DisplayLists weiter. Die sind extra dafür ausgelegt, dass man größere Mengen an Punkten/ Vertices verwenden kann. Dafür werden (u.a.) die Funktionen/ Prozeduren [oh]glNewList, glEndList, glCallList[/oh] verwendet.
MfG Binärbaum |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
hallo zusammen,
habe nun mein programm soweit fertig. @binärbaum : Danke für all deine tips, am besten funktioniert das mit der display list :thumb: Ich lade so eine 50MB Datei ohne dass es ruckelt echt stark. :hello: Ich möchte aber noch weiter optimieren, wenns geht möchte ich so an die 100MB laden. Es würde auch keine Rolle spielen wenn ich die Daten in ein anderes Format bringen muss oder der gleichen. Danke im voraus |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
die daten sind im "textformat gespeichert", nachdem sie aus unserer Photogrammetrie software exportiert wurden.
Folgendes Format. Y X H Grauwert ---------------------------------------------------- -43262.135 55582.762 418.905 138 -43262.134 55582.772 418.905 123 |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
habe gerade etwas über Frustum Culling und Octrees gelesen,
das klingt irgendwie auch noch interessant. Ist es deiner meinung nach sinnvoll diese beiden Funktionen in mein Programm zu integrieren? |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
Da diese Daten im "Textformat gespeichert" sind, muss man diesen Text ja immer erst mit ![]() ![]() ![]() MfG Binärbaum |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
|
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
Die heutigen Festplatten haben zwar meist eine Lesegeschwindigkeit, dass die Größenverminderung der Datei nicht so sehr ins Geewicht fällt. Es geht mir vielmehr um diese StrToFloat-Funktion, denn diese ist nicht gerade schnell. Bei einer 100MB großen Datei fällt diese Umwandlung mehr ins Gewicht als das reine Lesen von der Festplatte. MfG Binärbaum |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Erspare ich mit beim Enlesen über einen Stream das umwandeln??
bzw. Ersetzens des Punktes durch ","?? Was ich bräuchte, Ein Format in dem ich grosse Datenmengen Speichern kann, auf die quasi in Echtzeit zugegriffen werden kann. Da ich mir vorstelle dass der Anwender beim Laden der Punktwolke diese sozusagen aus einer Entfernung sieht die nur eine geringe Qualität erfordert (grober Raster). Der Benutzer bewegt sich dann auf die Punktwolke zu und die Punkte werden sozusagen nachgeladen (feiner Raster) und angezeigt. Habe bis jetzt noch nicht mit dieser Methode des einlesens von Daten gearbeitet. @SniperW: bzgl. Frustum Culling, Octrees. Da ich ja jetzt die Displaylisten verwende gibt es eigentlich nicht mehr viel zu Rendern in meiner anwendung. d.h.: diese Methoden würden mir dann keinen erheblichen geschwindigkeitsvorteil mehr bringen richtig? Übrigens die Daten werden nur beim Programmstart eingelesen und Bleiben dann unverändert (Statische Punktwolke). Danke für eure kompetenten ratschläge, ihr helft mir hier richtig weiter :thumb: |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
Also, Optimierungen sollten an Server- als auch an ClientSide durchgeführt sein. Und wenn du immer nur ein Teil denes Wollkes siehst, dann werden sie wohl einen Geschwindigkeitsvorteilbringen. |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
mal eine Frage,
es gibt doch die möglichkeit mehrere Displylisten zu erstellen, könnte ich z.b.: 3 Displaylisten erstellen und in jede Displaliste 30MB laden, beim durchfahren wird dann die jeweils gültige angezeigt. Ist das schneller als wenn alle Punkte nur in einer Liste liegen? |
Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
Zitat:
Zitat:
MfG Binärbaum |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz