Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi OpenGL Beschleunigungs Routinen oder Codeoptimierung (https://www.delphipraxis.net/41353-opengl-beschleunigungs-routinen-oder-codeoptimierung.html)

mwiesbau 2. Mär 2005 12:19


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.

idontwantaname 2. Mär 2005 12:26

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:

Fubar 2. Mär 2005 12:31

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

Zitat von mwiesbau
PS.: Weiss jemand wie ich *.TIF Dateien als Texturen in OpenGL verwenden kann.

Mit DevIL kannst du ziemlich einfach Bild-Dateien laden und als Textur in OGL benutzen:
http://openil.sourceforge.net/

mwiesbau 2. Mär 2005 12:34

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:

sniper_w 2. Mär 2005 12:38

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

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.
Sorry, aber das ist grauenhaft. Denn um ein Punkt aus einem String zu bekommen, brauchst du die String-Handling Funktionen, die für ein schnelleres Rendervorgang gar nicht geeignet sind. Die Punkte müssen sich in einem "native" Format befinden, z.B. als ein Array of T3dPunkt :
Delphi-Quellcode:
type T3dPunkt = array[0..2]of Single;

var Punkte : array of T3dPunkt;
Sonst, solltest du uns etwas von dem Code schicken, um bessere Hilfe zu bekommen.

mwiesbau 2. Mär 2005 12:42

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.

sniper_w 2. Mär 2005 12:50

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;

mwiesbau 2. Mär 2005 13:13

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.

mwiesbau 2. Mär 2005 14:25

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??

sniper_w 2. Mär 2005 14:31

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Welches Problemm ?? :gruebel:

mwiesbau 2. Mär 2005 15:45

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
also die fehlermeldung sieht folgendermassen aus.

[Error] Unit2.pas(66): E2003 Undeclared identifier: 'GL_POINTS'

keine ahnung warum?

Binärbaum 2. Mär 2005 16:20

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

Zitat von mwiesbau
also die fehlermeldung sieht folgendermassen aus.

[Error] Unit2.pas(66): E2003 Undeclared identifier: 'GL_POINTS'

keine ahnung warum?

Die Unit OpenGL hast du aber in der uses-Klausel stehen, oder nicht?

sniper_w 2. Mär 2005 16:22

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Ja, das muss das Problemm sein. Du hast die erste Zeile meines Postings versehen.

mwiesbau 2. Mär 2005 17:02

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

Binärbaum 2. Mär 2005 17:13

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

mwiesbau 2. Mär 2005 17:18

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
die fehlermeldung kommt auch für GL_Lines, GL_Linestrip usw.

LarsMiddendorf 2. Mär 2005 17:21

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Du hast die unit opengl nicht eingebunden.

Binärbaum 2. Mär 2005 17:22

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

Zitat von LarsMiddendorf
Du hast die unit opengl nicht eingebunden.

Das hab ich ja schon gesagt, aber mir glaubt's ja keiner.

mwiesbau 2. Mär 2005 17:26

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.

Binärbaum 2. Mär 2005 17:32

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.

mwiesbau 2. Mär 2005 17:35

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

mwiesbau 3. Mär 2005 08:03

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

Binärbaum 3. Mär 2005 11:37

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

mwiesbau 4. Mär 2005 14:17

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

Binärbaum 5. Mär 2005 02:25

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

Zitat von mwiesbau
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.

Welches Format nutzt du den bisher zum Speichern der Daten?

mwiesbau 5. Mär 2005 08:58

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

mwiesbau 5. Mär 2005 09:03

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?

sniper_w 5. Mär 2005 13:39

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

Ist es deiner meinung nach sinnvoll diese beiden Funktionen in mein Programm zu integrieren?
Sehr sogar. Besonders wenn es viel zu rendern gibt.

Binärbaum 5. Mär 2005 14:01

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

Zitat von mwiesbau
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

Nun, dieses Format ist zwar sehr anschaulich, aber zum Einlesen gibt es bessere Varianten.
Da diese Daten im "Textformat gespeichert" sind, muss man diesen Text ja immer erst mit Delphi-Referenz durchsuchenStrToFloat in die entsprechende Floating-Point Darstellung umwandeln. Das ist nicht gerade effektiv (oder schnell). Stattdessen könnte man Delphi-Referenz durchsuchentypisierte Dateien oder Delphi-Referenz durchsuchenStreams verwenden, mit denen man die Daten ausliest und speichert. Das wäre um ein Vielfaches schneller.

MfG
Binärbaum

sniper_w 5. Mär 2005 14:08

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

Nun, dieses Format ist zwar sehr anschaulich, aber zum Einlesen gibt es bessere Varianten.
Da diese Daten im "Textformat gespeichert" sind, muss man diesen Text ja immer erst mit Schau in die Delphi-HilfeStrToFloat in die entsprechende Floating-Point Darstellung umwandeln. Das ist nicht gerade effektiv (oder schnell). Stattdessen könnte man Schau in die Delphi-Hilfetypisierte Dateien oder Schau in die Delphi-HilfeStreams verwenden, mit denen man die Daten ausliest und speichert. Das wäre um ein Vielfaches schneller.
Genau. Aber wenn die Datei nicht all zu gross ist und es nur einmal am Anfang des Programms geladen wird, dann IMHO spielt das keine grosse Rolle. (nur die *.txt Dateien sind in diesem Fall meistens grösser )

Binärbaum 5. Mär 2005 14:15

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

Zitat von sniper_w
Genau. Aber wenn die Datei nicht all zu gross ist und es nur einmal am Anfang des Programms geladen wird, dann IMHO spielt das keine grosse Rolle. (nur die *.txt Dateien sind in diesem Fall meistens grösser )

Naja, mwiesbau wollte Dateien mit bis zu 100MB Größe einlesen, da ist das schon nicht ganz unerheblich. Ich weiß zwar nicht, wie oft die Daten eingelesen werden, aber wenn es schneller gehen soll, muss man weg vom Textformat und Streams nutzen.
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

mwiesbau 5. Mär 2005 16:01

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:

sniper_w 5. Mär 2005 16:39

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

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?
In OpenGL gibt es 2 Seiten, "Server" und "Client". Alles was für dich deine Garka erlädigt (z.b DisplayListen, Matrix Manipulation, Licht-, Blend-, u.s.w., Berechnungen) sind "ServerSide" Features, die selbst sehr dazu optimiert sind (b.z.w. GPU). ClientSide bist du, schickst Daten, wählst verschiedenen "States" u.s.w. an Garka.
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.

mwiesbau 5. Mär 2005 16:56

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?

Binärbaum 5. Mär 2005 17:14

Re: OpenGL Beschleunigungs Routinen oder Codeoptimierung
 
Zitat:

Zitat von mwiesbau
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.
...
Übrigens die Daten werden nur beim Programmstart eingelesen und Bleiben dann unverändert (Statische Punktwolke).

Ja, bei Streams braucht man keine Punkte durch "," ersetzen, wenn man die Daten schon als Double (oder Real, oder Single) speichert.
Zitat:

Zitat von mwiesbau
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?

Ja, diese Möglichkeit wäre vorteilhaft, vor allem, wenn stets nur ein Teil der Punkte angezeigt werden muss. Dazu teilt man diese in mehrere Display-Listen ein und lädt nur die benötigten Daten.

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