Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 23:15

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Mi Okt 06, 2004 15:46 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Servus zusammen...

Ich hab ein Problem mit nem Octree, besser gesagt mit dem Test des selbigen.

Ich hab gerade das Tut von Shadow durchgearbeitet und erstmal(für später sind mir paar Verbesserungen eingefallen) seinen Octree implementiert.

So...das ganze sollte in ner kleinen Anwendung Laufen im Vergleich zu nem brutForce Hightmap Renderer.
Also hab ich eine Funktion geschrieben, die die Hightmap daten in ein Feld mit Dreiecken umbaut.
Das erstellen der Highmapdaten funktioniert fehlerlos. Das weiß ich, weil ich den Highmaprenderer schon getestet hab.
Beim umbau in ein Dreickfeld kommt es dann aber zu Problemen.

(Wem der Code abschreckend groß vorkommt, einfach überspringen...)

Typdefs:
Code:
  1.   TFullVertex = record
  2.       Pos, N : TGLArrayf3;
  3.       u,v    : GLFloat;
  4.   end;
  5.   PFullVertex = ^TFullVertex;
  6.  
  7.   TTriangle = array[0..2] of TFullVertex;
  8.   PTriangle = array[0..2] of PFullVertex;
  9.  
  10.   TTriangleData = array of PTriangle;


die Funktion sieht so aus:
Code:
  1. function LoadHightMapDataForOctree(var TriArray : TTriangleData;
  2.                                          SFactor, HFactor : real;
  3.                                          Filename : String; Path : String = ''): byte;
  4. type
  5.     TVertex3f = record
  6.                   x,y,z : real;
  7.     end;
  8.  
  9. var BitMap              : TBitMap;
  10.     i,j                 : integer;
  11.     TriAnz              : integer;
  12.     FData               : array of array of TVertex3f;
  13.     P1,P2,P3,P4,P0,N    : TGLArrayf3;
  14.  
  15. begin
  16.      {
  17.        Laden der Highmap daten.
  18.       }
  19.       // Daten befinden sich nun in einer Matrix
  20.       // Jeder Eintrag muss jetzt in 4 Dreiecke aufgesplittet werden (wie Triangle_fan)
  21.       // Die Eckpunkte passen ihre Höhe den Nachbarn an
  22.       TriAnz := 0;
  23.  
  24.      for i := 0 to high(FData) do
  25.          for j := 0 to high(FData[i]) do
  26.              if (i=0)or(j=0)or(i=high(FData))or(j=high(FData[i])) then
  27.              begin
  28.                 {
  29.                  momentan noch leer.
  30.                  }
  31.              end else
  32.              begin
  33.  
  34.                 P0[0] := (FData[i,j].x*SFactor);
  35.                 P0[1] := FData[i,j].y*HFactor;
  36.                 P0[2] := (FData[i,j].z*SFactor);
  37.  
  38.                 P1[0] := (FData[i,j].x*SFactor)-(SFactor/2);
  39.                 P1[1] := (FData[i-1,j-1].y*HFactor)+(FData[i-1,j].y*HFactor)+(FData[i,j].y*HFactor)+(FData[i,j-1].y*HFactor);
  40.                 P1[1] := P1[1]/4;
  41.                 P1[2] := (FData[i,j].z*SFactor)-(SFactor/2);
  42.  
  43.                 P2[0] := (FData[i,j].x*SFactor)-(SFactor/2);
  44.                 P2[1] := (FData[i+1,j-1].y*HFactor)+(FData[i+1,j].y*HFactor)+(FData[i,j].y*HFactor)+(FData[i,j-1].y*HFactor);
  45.                 P2[1] := P2[1]/4;
  46.                 P2[2] := (FData[i,j].z*SFactor)+(SFactor/2);
  47.  
  48.                 P3[0] := (FData[i,j].x*SFactor)+(SFactor/2);
  49.                 P3[1] := (FData[i+1,j+1].y*HFactor)+(FData[i+1,j].y*HFactor)+(FData[i,j].y*HFactor)+(FData[i,j+1].y*HFactor);
  50.                 P3[1] := P3[1]/4;
  51.                 P3[2] := (FData[i,j].z*SFactor)+(SFactor/2);
  52.  
  53.                 P4[0] := (FData[i,j].x*SFactor)+(SFactor/2);
  54.                 P4[1] := (FData[i-1,j+1].y*HFactor)+(FData[i-1,j].y*HFactor)+(FData[i,j].y*HFactor)+(FData[i,j+1].y*HFactor);
  55.                 P4[1] := P4[1]/4;
  56.                 P4[2] := (FData[i,j].z*SFactor)-(SFactor/2);
  57.  
  58.                 Inc(TriAnz);
  59.                 setLength(TriArray,TriAnz);
  60.  
  61.                 New(TriArray[TriAnz-1][0]);
  62.                 New(TriArray[TriAnz-1][1]);
  63.                 New(TriArray[TriAnz-1][2]);
  64.  
  65.                 // 1. Dreieck
  66.                 N := CalcNormalVector(P0,P1,P2);
  67.  
  68.                 TriArray[TriAnz-1][0]^.Pos := P0;
  69.                 TriArray[TriAnz-1][0]^.N   := N;
  70.                 TriArray[TriAnz-1][1]^.Pos := P1;
  71.                 TriArray[TriAnz-1][1]^.N   := N;
  72.                 TriArray[TriAnz-1][2]^.Pos := P2;
  73.                 TriArray[TriAnz-1][2]^.N   := N;
  74.  
  75.                 Inc(TriAnz);
  76.                 setLength(TriArray,TriAnz);
  77.  
  78.                 New(TriArray[TriAnz-1][0]);
  79.                 New(TriArray[TriAnz-1][1]);
  80.                 New(TriArray[TriAnz-1][2]);
  81.  
  82.                 // 2. Dreieck
  83.                 N := CalcNormalVector(P0,P2,P3);
  84.  
  85.                 TriArray[TriAnz-1][0]^.Pos := P0;
  86.                 TriArray[TriAnz-1][0]^.N   := N;
  87.                 TriArray[TriAnz-1][1]^.Pos := P2;
  88.                 TriArray[TriAnz-1][1]^.N   := N;
  89.                 TriArray[TriAnz-1][2]^.Pos := P3;
  90.                 TriArray[TriAnz-1][2]^.N   := N;
  91.  
  92.                 Inc(TriAnz);
  93.                 setLength(TriArray,TriAnz);
  94.  
  95.                 New(TriArray[TriAnz-1][0]);
  96.                 New(TriArray[TriAnz-1][1]);
  97.                 New(TriArray[TriAnz-1][2]);
  98.  
  99.                 // 3. Dreieck
  100.                 N := CalcNormalVector(P0,P3,P4);
  101.  
  102.                 TriArray[TriAnz-1][0]^.Pos := P0;
  103.                 TriArray[TriAnz-1][0]^.N   := N;
  104.                 TriArray[TriAnz-1][1]^.Pos := P3;
  105.                 TriArray[TriAnz-1][1]^.N   := N;
  106.                 TriArray[TriAnz-1][2]^.Pos := P4;
  107.                 TriArray[TriAnz-1][2]^.N   := N;
  108.  
  109.                 Inc(TriAnz);
  110.                 setLength(TriArray,TriAnz);
  111.  
  112.                 New(TriArray[TriAnz-1][0]);
  113.                 New(TriArray[TriAnz-1][1]);
  114.                 New(TriArray[TriAnz-1][2]);
  115.  
  116.                 // 4. Dreieck
  117.                 N := CalcNormalVector(P0,P4,P1);
  118.  
  119.                 TriArray[TriAnz-1][0]^.Pos := P0;
  120.                 TriArray[TriAnz-1][0]^.N   := N;
  121.                 TriArray[TriAnz-1][1]^.Pos := P4;
  122.                 TriArray[TriAnz-1][1]^.N   := N;
  123.                 TriArray[TriAnz-1][2]^.Pos := P1;
  124.                 TriArray[TriAnz-1][2]^.N   := N;
  125.  
  126.              end;
  127. end;


folgendes passiert:

1. Es dauert ewig bis eine 512x512 Highmap durchläuft!
2. Es läuft nicht durch, da ein RunOutOfMemory Fehler auftritt!!!


Also ich bin bisl verblüfft denn, die Funktion basiert direkt auf der Zeichenfunktion für die Highmap. Ich hab eigentlich nur den Triangle_Fan ersetzt. (siehe nächster Post.)

Hat einer von euch ne Idee wies zu dem OutOfMemory Fehler kommen kann. Wo ist das Loch?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 06, 2004 15:54 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Oben fehlte noch die angesprochene Renderprocedure

Code:
  1. procedure CHightMap.Render;
  2. var i,j   : integer;
  3.     P1,P2,P3,P4,P0,N : TGLArrayf3;
  4. begin
  5.      for i := 0 to high(FData) do
  6.          for j := 0 to high(FData[i]) do
  7.              if (i=0)or(j=0)or(i=high(FData))or(j=high(FData[i])) then
  8.              begin
  9.                 glNormal3f(0,1,0);
  10.                 glBegin(GL_TRIANGLE_FAN);
  11.                   glColor3f(FData[i,j].y,FData[i,j].y,FData[i,j].y);
  12.                   glVertex3f((FData[i,j].x*SizeFactor)               ,   FData[i,j].y*HightFactor,   (FData[i,j].z*SizeFactor)               );
  13.                   glVertex3f((FData[i,j].x*SizeFactor)-(SizeFactor/2),   FData[i,j].y*HightFactor,   (FData[i,j].z*SizeFactor)-(SizeFactor/2));
  14.                   glVertex3f((FData[i,j].x*SizeFactor)-(SizeFactor/2),   FData[i,j].y*HightFactor,   (FData[i,j].z*SizeFactor)+(SizeFactor/2));
  15.                   glVertex3f((FData[i,j].x*SizeFactor)+(SizeFactor/2),   FData[i,j].y*HightFactor,   (FData[i,j].z*SizeFactor)+(SizeFactor/2));
  16.                   glVertex3f((FData[i,j].x*SizeFactor)+(SizeFactor/2),   FData[i,j].y*HightFactor,   (FData[i,j].z*SizeFactor)-(SizeFactor/2));
  17.                   glVertex3f((FData[i,j].x*SizeFactor)-(SizeFactor/2),   FData[i,j].y*HightFactor,   (FData[i,j].z*SizeFactor)-(SizeFactor/2));
  18.                 glEnd;
  19.              end else
  20.              begin
  21.  
  22.                 P0[0] := (FData[i,j].x*SizeFactor);
  23.                 P0[1] := FData[i,j].y*HightFactor;
  24.                 P0[2] := (FData[i,j].z*SizeFactor);
  25.  
  26.                 P1[0] := (FData[i,j].x*SizeFactor)-(SizeFactor/2);
  27.                 P1[1] := (FData[i-1,j-1].y*HightFactor)+(FData[i-1,j].y*HightFactor)+(FData[i,j].y*HightFactor)+(FData[i,j-1].y*HightFactor);
  28.                 P1[1] := P1[1]/4;
  29.                 P1[2] := (FData[i,j].z*SizeFactor)-(SizeFactor/2);
  30.  
  31.                 P2[0] := (FData[i,j].x*SizeFactor)-(SizeFactor/2);  
  32.                 P2[1] := (FData[i+1,j-1].y*HightFactor)+(FData[i+1,j].y*HightFactor)+(FData[i,j].y*HightFactor)+(FData[i,j-1].y*HightFactor);
  33.                 P2[1] := P2[1]/4;
  34.                 P2[2] := (FData[i,j].z*SizeFactor)+(SizeFactor/2);
  35.  
  36.                 P3[0] := (FData[i,j].x*SizeFactor)+(SizeFactor/2);
  37.                 P3[1] := (FData[i+1,j+1].y*HightFactor)+(FData[i+1,j].y*HightFactor)+(FData[i,j].y*HightFactor)+(FData[i,j+1].y*HightFactor);
  38.                 P3[1] := P3[1]/4;
  39.                 P3[2] := (FData[i,j].z*SizeFactor)+(SizeFactor/2);
  40.  
  41.                 P4[0] := (FData[i,j].x*SizeFactor)+(SizeFactor/2);
  42.                 P4[1] := (FData[i-1,j+1].y*HightFactor)+(FData[i-1,j].y*HightFactor)+(FData[i,j].y*HightFactor)+(FData[i,j+1].y*HightFactor);
  43.                 P4[1] := P4[1]/4;
  44.                 P4[2] := (FData[i,j].z*SizeFactor)-(SizeFactor/2);
  45.  
  46.                 glBegin(GL_TRIANGLE_FAN);
  47.                   glColor3f(FData[i,j].y,FData[i,j].y,FData[i,j].y);
  48.  
  49.                   N := CalcNormalVector(P0,P1,P2);
  50.                   glNormal3fv(@N[0]);
  51.                   glVertex3fv(@P0[0]);
  52.                   glVertex3fv(@P1[0]);
  53.                   glVertex3fv(@P2[0]);
  54.                   N := CalcNormalVector(P0,P2,P3);
  55.                   glNormal3fv(@N[0]);
  56.                   glVertex3fv(@P3[0]);
  57.                   N := CalcNormalVector(P0,P3,P4);
  58.                   glNormal3fv(@N[0]);
  59.                   glVertex3fv(@P4[0]);
  60.                   N := CalcNormalVector(P0,P4,P1);
  61.                   glNormal3fv(@N[0]);
  62.                   glVertex3fv(@P1[0]);
  63.                 glEnd;
  64.              end;
  65. end;

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 06, 2004 16:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Ich würde dir empfehlen den Code nochmal aufzubereiten so im Schnelldurchgang kann ich dir da nicht helfen.
Vorallem solltest du es etwas transparenter gestallten. Damit meine ich das du die ganzen "New"s rausnimmst und keine oder zumindest weniger Zeiger verwendest.

Auch ist mir nicht ganz klar was du im ersten Teil genau machst. Also ich würde jeden Pixel als Höhenbeschreibung sehen und jeweils 4 solcher Höhen Punkte mit 2 Dreiecken verbinden. Dannach würde ich diese Daten an eine entsprechende Octree Klasse übergeben, welche diese unterteilt.

MfG
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 06, 2004 17:05 
Offline
DGL Member

Registriert: Mi Aug 18, 2004 13:46
Beiträge: 5
Wo dein speicherloch ist ?? hier :

Code:
  1.  
  2.     [...]
  3.     setLength(TriArray,TriAnz);
  4.  
  5.     New(TriArray[TriAnz-1][0]);
  6.     New(TriArray[TriAnz-1][1]);
  7.     New(TriArray[TriAnz-1][2]);
  8.     [...]
  9.  


bei einer 512x512 heigthmap rufst du SetLength ca 1.000.000 (510x510 mal die schleife + 4 mal pro Dreick) mal auf und übergibst immer nur einen wert der um 1 höher ist als der letzte.... und der delphi memory manager ist hierfür nicht wirklich geeignet :(
hier zum nachlesen

warum machst du das eigentlich so umständlich ??? mach doch einfach sowas :
Code:
  1.  
  2.   TTriangleData = array of Triangle
  3.  

und fertig

und vor deinen beiden schleifen wo du dein array mit werten füllst dann ein einziges setlength :
Code:
  1.  
  2.   SetLength(TriArray, (High(FData)-2) * (High(FData[0])-2));
  3.  


daher dürfte auch die lange ladezeit kommen.
als kleines beispiel. auf http://www.frustum.org gibt es eine GeoMorphing demo. diese läd eine 1025*1025 heightmap und baut darauf einen quadtree auf
alleine die terrain daten belegen dabei ca. 7mb speicher und das ganze ding läd in 5-10 sekunden bei mir ....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 07, 2004 12:59 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also is das Setlength der Speicherfresser? Dann werd ich den Speicher mal in einem Zug alokieren.
Allerdings mit:
Code:
  1. SetLength(TriArray, (Lenght(FData)) * (Lenght(FData[0]))*4 );


Da aus jedem Höhenwert 4 Dreiecke werden sollen. (Ich verbinde nicht die Höhenwerte der Hightmap sondern benutze sie als Zentrum für einen Triangle_Fan.)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 07, 2004 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Zitat:
Also is das Setlength der Speicherfresser?

Das ist nicht das Speicherleck oder der Speicherfresser. So zu coden ist nur zimlich rechenintensiv.

Beispiel
Dieser Integer Arraymit 9 Elementen ist gespeichert:
->(1,0,3,46,2345,56,234,67,43)
Nun möchtest du noch eine weitere Zahl ranhängen.
Leider ist wie sich rausstellt der Speicher nach 43 schon belegt so das erst ein neuer Speicher reserviet werden muss.
->Neuer Zehner-Block erstellt:(?,?,?,?,?,?,?,?,?,?)
Dazu wird nun ein Speicherblock für alle 10 Zahlen reserviert um anschließend die Daten vom einen in den neuen zu kopieren
->(1,0,3,46,2345,56,234,67,43)-kopiert->(1,0,3,46,2345,56,234,67,43,?)

So ungefähr stelle ich mir die internen Vorgänge vor und viel anders werden sie auch nicht sein.

Wie ich dir schon sagte würde ich ganz auf die New-Befehle verzichten, oder dir zumindest klar machen für was du wievel Speicher brauchst.

Was mir total unverständlich erscheint, ist das du Zeiger auf TFullVertex verwendest statt TFullVertex selbst.
Kannst du mir das mal erkären?

MfG
IFlo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 07, 2004 15:07 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Weil ich ein Feld von zeigern brauche um den Octree zu bauen. (Siehe Shadows Tutorial). Deshalb erstell ich gelich alle daten über das Zeigerfeld astatt erst ein Feld und dann die Zeiger auf das Feld zu basteln.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 07, 2004 15:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Seit wann braucht man Zeiger für nen Octree? Meine letzte Implementation (sieh Grasslayer-Demo im Shaderforum) kommt komplett ohne Zeiger aus, und ist dadurch nicht nur übersichtlicher, sondern auch leichter zu warten.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 07, 2004 15:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
evtl. findeste noch raus wies geht, flash, ich such trotzdem mal bei mir, hatte schonmal nen octree gebastelt. evtl. kann ich dir das geben und du kannst bissl was mit anstellen.

rswm

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 07, 2004 21:32 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja...öhmmm mag sein... :oops:

Ich hab den Baum jetzt am Start allerdings is der Aufbau erst bei max. 5000 Dreiecke pro Node akzeptabel. (dauert trotzdem 5-10 sec)

Ich weiß immer noch net wieso das so langsam is. Der tip mit dem SetLength() war sehr gut. Ich hab die SetLength() jetzt immer zusammengefasst, auch wenn das bedeutet, dass ich die Polys fürs einsortieren in den Node nochmal durchlaufen muss.

Ich lad mal mein Projektverzeichnis hoch. Eventuell könnte da mal jemand reingucken. Abgesehen von der Typwahl (die hier schon diskutiert wurde 8) ) sollte der Code einfach zu lesen sein.

Mit den Tasten:

0,1,2,3: Umschalten zwischen Rendermodie (Bruteforce, Octree, ...)
Cursor: verschieben der Map
Sondertasten über Cursor: Rotation der Map

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 07, 2004 21:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
5-10sec??? naja bei mir wars mehr als ne min!!!!!!

ich schau mal bei mir nach

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 08, 2004 10:29 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Öhmmm hast du die MAX_TRIANGLES_PRO_NODE auf 5000 gestellt? (glaube stehen momentan auf 3000 :wink: )
Ansonsten hab ich nen P4 2500, 512 MB RAM, Radeon 9000 Family( :evil: )

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 11, 2004 17:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
So, hab mir die Sache mal kurz angesehen und folgendes Fazit :

1. Warum arbeitest du mit Pointern? Deklariere TTriangleData als array of TTriangle, statt array of PTriangle und du sparst dir den ganzen Zeigerkram. Momentan machst du z.B. diverse New-Aufrufe, aber in deinem kompletten Quelltext habe ich nicht gesehen dass du den so angeforderten Speicher jemals wieder mittels Free freigibst. Speicher der mit Befeheln wie New allokiert wird, wird beim Beenden deiner Anwendung nicht freigegeben. Wenn du aber direkt mit einem dynamischen Array arbeitest, musst du dir darüber keine Sorgen machen. Im Endeffekt ist ein dynamisches Array nix anders als ein Zeigerarray, aber Delphi kapselt dir die ganzen Zeigereigenheiten quasi weg.

2. Es dauert bei mir nicht sonderlich lange den Octree zu erstellen (tippe mal auf < 40 Sekunden). Da deine Heightmap (hast du übrigens in deinen Units überall falsch geschrieben) über 250.000 Dreiecke generiert, kann das zeitlich schon gut hinkommen, denn 250.000 Dreiecke sind ne Menge. Da liesse sich evtl. hier und da noch was optimieren, aber bei so großen Dreieckssuppen sollte man den Octree eh offline generieren (ich verweise mal auf den BaseLevelBaker von Mars, siehe Projektforum).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 11, 2004 18:22 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
Sascha Willems hat geschrieben:
Seit wann braucht man Zeiger für nen Octree? Meine letzte Implementation (sieh Grasslayer-Demo im Shaderforum) kommt komplett ohne Zeiger aus, und ist dadurch nicht nur übersichtlicher, sondern auch leichter zu warten.

Nur so nebenbei, das moechte ich mal bezweifeln, oder verwendest du keine Objekte? :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 11, 2004 18:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ist mir schon klar das Objekte als Zeiger übergeben werden, aber mit "man braucht keine Zeiger" meinte ich Zeiger als Variablen. Habe doch oben geschrieben dass ein dynamisches Array auch nix weiter als ein Zeiger ist, aber dies eben wegkapselt.

P.S. : Besonders viel hat dein Posting mit dem Octree-Problem aber irgendwie nicht zu tun.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 15 Queries | GZIP : On ]