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

Aktuelle Zeit: Fr Jul 18, 2025 14:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texturen machen den RAM voll !!!!!!
BeitragVerfasst: Sa Mai 24, 2008 21:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
Hallo
Ich hab ein sehr ernsthaftes Problem mit den Texturen. Und zwar mache ich im Moment ein Program, was eine Art Map erstellen soll auf der man sich frei bewegen kann. Dafür brauche ich natürlich viela verschiedene Texturen. Und da liegt das Problem: Da ich die Texturen in der Render Schleife wechsele werden sie in regelmäßigen Abständen aufgerufen( was ja auf nötig ist da ich nach einer Bewegung sonst keine Textur mehr hätte). Dadurch scheinen die Texturen im RAM abgelegt zu werden und trotz der Zeile
Code:
  1.  SDL_FreeSurface(tex);
nicht gelöscht zu werden , da nach ca. einer Minute meine gesamter 2 GB Ram voll belegt ist und die Texturen in dem Program nur noch als weiße Flächen angezeigt werden.
Ich hoffe dass mir jemand mit diesem Problem helfen kann.
Vielen Dank schon für eure Antworten.
MFG

Hier einmal die Funktion zum Aufrufen der Textur:
Code:
  1.  procedure TForm1.Textur;
  2. var TexID :gluInt;
  3. begin
  4. tex := IMG_Load('./Mauer.jpg');
  5.  
  6.     if assigned(tex) then
  7.   begin
  8.     glGenTextures(1, @TexID);
  9.     glBindTexture(GL_TEXTURE_2D, TexID);
  10.  
  11.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  12.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  13.  
  14.  
  15.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  16.  
  17.     SDL_FreeSurface(tex);
  18.   end;
  19. end;



Und hier das gesamte Program:

Code:
  1. unit UnitInfo;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs,DGLOpenGL, ExtCtrls,SDL, SDL_Image;
  8. const
  9.  NearClipping = 1;
  10.  FarClipping  = 1000;
  11. type
  12.   TForm1 = class(TForm)
  13.     Timer1: TTimer;
  14.     procedure FormCreate(Sender: TObject);
  15.     procedure IdleHandler(Sender: TObject; var Done: Boolean);  //nur für die OnIdle Methode!
  16.     procedure FormResize(Sender: TObject);
  17.     procedure FormDestroy(Sender: TObject);
  18.   private  { Private-Deklarationen }
  19.     StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
  20.     Frames, DrawTime                  : Cardinal; //& Timebased Movement
  21.     procedure SetupGL;
  22.     procedure Render;
  23.     procedure ErrorHandler;
  24.     procedure Textur;
  25.     procedure Textur2;
  26.     procedure Erde;
  27.     procedure Mauern;
  28.   public   { Public-Deklarationen }
  29.     DC                                : HDC;  //Handle auf Zeichenfläche
  30.     RC                                : HGLRC;//Rendering Context
  31.  
  32.   end;
  33.  
  34. var
  35.   Form1: TForm1;
  36.   texture : integer;
  37.   tex,tex2 : PSDL_Surface;
  38.   z,x : real;
  39. implementation
  40.  
  41. {$R *.dfm}
  42.  
  43.  
  44.  
  45. procedure TForm1.FormCreate(Sender: TObject);
  46. var TexID :gluInt;
  47. begin
  48.   DC:= GetDC(Handle);
  49.   if not InitOpenGL then Application.Terminate;
  50.   RC:= CreateRenderingContext( DC,
  51.                                [opDoubleBuffered],
  52.                                32,
  53.                                24,
  54.                                0,0,0,
  55.                                0);
  56.   ActivateRenderingContext(DC, RC);
  57.   SetupGL;
  58.   glClearColor(0.0, 0.0, 0.0, 0.0); // nur evetuell verwenden siehe nächster Teil
  59.   Application.OnIdle := IdleHandler;
  60.  
  61.  
  62.   z := -2.5;
  63.   x := -1.5;
  64. end;
  65.  
  66. procedure TForm1.SetupGL;
  67. begin
  68.   glClearColor(0.2, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau ode rauch nichT <!-- s:) --><img src=\"{SMILIES_PATH}/icon_smile.gif\" alt=\":)\" title=\"Smile\" /><!-- s:) -->
  69.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  70.   //glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  71. end;
  72.  
  73. procedure TForm1.FormResize(Sender: TObject);
  74. var tmpBool : Boolean;
  75. begin
  76.   glViewport(0, 0, ClientWidth, ClientHeight);
  77.   glMatrixMode(GL_PROJECTION);
  78.   glLoadIdentity;
  79.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);    
  80.  
  81.   glMatrixMode(GL_MODELVIEW);
  82.   glLoadIdentity;
  83.   IdleHandler(Sender, tmpBool); //nur für OnIdle!
  84. end;
  85.  
  86. procedure TForm1.FormDestroy(Sender: TObject);
  87. begin
  88.   DeactivateRenderingContext;
  89.   DestroyRenderingContext(RC);
  90.   ReleaseDC(Handle, DC);
  91. end;
  92.  
  93. procedure TForm1.Textur;
  94. var TexID :gluInt;
  95. begin
  96. if texture = 1 then
  97. tex := IMG_Load('./Mauer.jpg');
  98.  
  99. if texture = 2 then
  100. tex := IMG_Load('./oben.jpg');
  101.  
  102.     if assigned(tex) then
  103.   begin
  104.     glGenTextures(1, @TexID);
  105.     glBindTexture(GL_TEXTURE_2D, TexID);
  106.  
  107.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  108.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  109.  
  110.  
  111.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  112.  
  113.     SDL_FreeSurface(tex);
  114.   end;
  115. end;
  116.  
  117.  
  118. procedure TForm1.Erde;
  119. var lauf,zErde :integer;
  120. begin
  121. glEnable(GL_TEXTURE_2D);
  122. texture := 2;
  123. Textur;
  124. zErde := 6;
  125. for lauf := 1 to 5 do
  126. begin
  127.   glBegin(GL_Quads);
  128.    glVertex3f(-2, 0, zErde);glTexCoord2f(0,0);
  129.    glVertex3f(0, 0, zErde);glTexCoord2f(0,1);
  130.    glVertex3f(0, 0, zErde-2);glTexCoord2f(1,1);
  131.    glVertex3f(-2, 0, zErde-2);glTexCoord2f(1,0);
  132.  glEnd();
  133.  zErde := zErde-2;
  134. end;
  135.  
  136. zErde := 6;
  137. for lauf := 1 to 5 do
  138. begin
  139.   glBegin(GL_Quads);
  140.    glVertex3f(0, 0, zErde);glTexCoord2f(0,0);
  141.    glVertex3f(2, 0, zErde);glTexCoord2f(0,1);
  142.    glVertex3f(2, 0, zErde-2);glTexCoord2f(1,1);
  143.    glVertex3f(0, 0, zErde-2);glTexCoord2f(1,0);
  144.  glEnd();
  145.  zErde := zErde-2;
  146. end;
  147. zErde := 6;
  148. for lauf := 1 to 5 do
  149. begin
  150.   glBegin(GL_Quads);
  151.    glVertex3f(2, 0, zErde);glTexCoord2f(0,0);
  152.    glVertex3f(4, 0, zErde);glTexCoord2f(0,1);
  153.    glVertex3f(4, 0, zErde-2);glTexCoord2f(1,1);
  154.    glVertex3f(2, 0, zErde-2);glTexCoord2f(1,0);
  155.  glEnd();
  156.  zErde := zErde-2;
  157. end;
  158.  
  159. zErde := 6;
  160. for lauf := 1 to 5 do
  161. begin
  162.   glBegin(GL_Quads);
  163.    glVertex3f(4, 0, zErde);glTexCoord2f(0,0);
  164.    glVertex3f(6, 0, zErde);glTexCoord2f(0,1);
  165.    glVertex3f(6, 0, zErde-2);glTexCoord2f(1,1);
  166.    glVertex3f(4, 0, zErde-2);glTexCoord2f(1,0);
  167.  glEnd();
  168.  zErde := zErde-2;
  169. end;
  170. end;
  171.  procedure TForm1.Mauern;
  172.  begin
  173.  texture:=1;
  174.  Textur;
  175.  //1. Haus
  176.   glBegin(GL_Quads);
  177.    glVertex3f(1, 0.5, 1);glTexCoord2f(0,0);
  178.    glVertex3f(2, 0.5, 1);glTexCoord2f(0,1);
  179.    glVertex3f(2, 0  , 1);glTexCoord2f(1,1);
  180.    glVertex3f(1, 0  , 1);glTexCoord2f(1,0);
  181.  glEnd();
  182.  
  183.  glBegin(GL_Quads);
  184.    glVertex3f(1, 0.5, 2);glTexCoord2f(0,0);
  185.    glVertex3f(2, 0.5, 2);glTexCoord2f(0,1);
  186.    glVertex3f(2, 0  , 2);glTexCoord2f(1,1);
  187.    glVertex3f(1, 0  , 2);glTexCoord2f(1,0);
  188.  glEnd();
  189.  
  190.   glBegin(GL_Quads);
  191.    glVertex3f(1, 0.5, 2);glTexCoord2f(0,0);
  192.    glVertex3f(1, 0.5, 1);glTexCoord2f(0,1);
  193.    glVertex3f(1, 0  , 1);glTexCoord2f(1,1);
  194.    glVertex3f(1, 0  , 2);glTexCoord2f(1,0);
  195.  glEnd();
  196.  
  197.   glBegin(GL_Quads);
  198.    glVertex3f(2, 0.5, 1);glTexCoord2f(0,0);
  199.    glVertex3f(2, 0.5, 2);glTexCoord2f(0,1);
  200.    glVertex3f(2, 0  , 2);glTexCoord2f(1,1);
  201.    glVertex3f(2, 0  , 1);glTexCoord2f(1,0);
  202.  glEnd();
  203.  
  204.   glBegin(GL_Quads);
  205.    glVertex3f(1, 0.5, 1);glTexCoord2f(0,0);
  206.    glVertex3f(2, 0.5, 1);glTexCoord2f(0,1);
  207.    glVertex3f(2, 0.5, 2);glTexCoord2f(1,1);
  208.    glVertex3f(1, 0.5, 2);glTexCoord2f(1,0);
  209.  glEnd();
  210. //////////////////////////////////////////////////////////////////////////////
  211.   //zweites Haus
  212.   glBegin(GL_Quads);
  213.    glVertex3f(3, 0.5, 1);glTexCoord2f(0,0);
  214.    glVertex3f(4, 0.5, 1);glTexCoord2f(0,1);
  215.    glVertex3f(4, 0  , 1);glTexCoord2f(1,1);
  216.    glVertex3f(3, 0  , 1);glTexCoord2f(1,0);
  217.  glEnd();
  218.  
  219.  glBegin(GL_Quads);
  220.    glVertex3f(3, 0.5, 2);glTexCoord2f(0,0);
  221.    glVertex3f(4, 0.5, 2);glTexCoord2f(0,1);
  222.    glVertex3f(4, 0  , 2);glTexCoord2f(1,1);
  223.    glVertex3f(3, 0  , 2);glTexCoord2f(1,0);
  224.  glEnd();
  225.  
  226.   glBegin(GL_Quads);
  227.    glVertex3f(3, 0.5, 2);glTexCoord2f(0,0);
  228.    glVertex3f(3, 0.5, 1);glTexCoord2f(0,1);
  229.    glVertex3f(3, 0  , 1);glTexCoord2f(1,1);
  230.    glVertex3f(3, 0  , 2);glTexCoord2f(1,0);
  231.  glEnd();
  232.  
  233.   glBegin(GL_Quads);
  234.    glVertex3f(4, 0.5, 1);glTexCoord2f(0,0);
  235.    glVertex3f(4, 0.5, 2);glTexCoord2f(0,1);
  236.    glVertex3f(4, 0  , 2);glTexCoord2f(1,1);
  237.    glVertex3f(4, 0  , 1);glTexCoord2f(1,0);
  238.  glEnd();
  239.  
  240.   glBegin(GL_Quads);
  241.    glVertex3f(3, 0.5, 1);glTexCoord2f(0,0);
  242.    glVertex3f(4, 0.5, 1);glTexCoord2f(0,1);
  243.    glVertex3f(4, 0.5, 2);glTexCoord2f(1,1);
  244.    glVertex3f(3, 0.5, 2);glTexCoord2f(1,0);
  245.  glEnd();
  246.  ////////////////////////////////////////////////////////////////////////////
  247.  //Zwischenbau
  248.  glBegin(GL_Quads);
  249.    glVertex3f(2, 0, 1);glTexCoord2f(0,0);
  250.    glVertex3f(3, 0, 1);glTexCoord2f(0,1);
  251.    glVertex3f(3, 0.2, 1);glTexCoord2f(1,1);
  252.    glVertex3f(2, 0.2, 1);glTexCoord2f(1,0);
  253.  glEnd();
  254.  end;
  255.  
  256.  
  257.  procedure TForm1.Render;
  258.  begin
  259.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  260.   glMatrixMode(GL_PROJECTION);
  261.   glLoadIdentity;
  262.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  263.  
  264.   glMatrixMode(GL_MODELVIEW);
  265.   glLoadIdentity;
  266.   glEnable(GL_TEXTURE_2D);
  267.  
  268.   //Tastenabfrage
  269.   if GetAsyncKeystate(VK_LEFT) < 0 then
  270.    x := x +0.1;
  271.   if GetAsyncKeystate(VK_RIGHT) < 0 then
  272.    x := x -0.1;
  273.   if GetAsyncKeystate(VK_UP) < 0 then
  274.    z := z + 0.1;
  275.   if GetAsyncKeystate(VK_DOWN) < 0 then
  276.    z := z - 0.1;
  277.  
  278.   glTranslatef(x, -0.3, z);
  279.   //Ende Tastenabfrage
  280.   glPushMatrix();
  281.  
  282.   Erde;
  283.  
  284.  Mauern;
  285. glPopMatrix();
  286.  
  287.  
  288.  
  289.  
  290.   SwapBuffers(DC);
  291. end;
  292.  
  293.  
  294. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  295. begin
  296.   StartTime:= GetTickCount;
  297.   Render;
  298.   DrawTime:= GetTickCount - StartTime;
  299.   Inc(TimeCount, DrawTime);
  300.   Inc(FrameCount);
  301.  
  302.   if TimeCount >= 1000 then begin
  303.     Frames:= FrameCount;
  304.     TimeCount:= TimeCount - 1000;
  305.     FrameCount:= 0;
  306.     Caption:= InttoStr(Frames) + 'FPS';
  307.     ErrorHandler;
  308.   end;
  309.   sleep(40);
  310.   Done:= false;
  311. end;
  312.  
  313.  
  314. procedure TForm1.ErrorHandler;
  315. begin
  316.   Form1.Caption := gluErrorString(glGetError);
  317. end;
  318.  
  319.  
  320.  
  321.  
  322. end.
  323.  

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Zuletzt geändert von DK99 am So Mai 25, 2008 15:48, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 24, 2008 22:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Lade die Texturen während dem Initialisieren! Auf keinen Fall solltest du bei jedem Rendern die Texturen neu laden. Außerdem musst du wenn dann vor dem neu laden der Texturen auch die alten mit glDeleteTextures löschen.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 25, 2008 00:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Lord Horazont das würde ich so nicht pauschal unterschreiben. Denn er sagte ja er hat viele Texturen und ich denke das da wird nur ein Beispiel sein. Deswegen denke ich wird er sie nicht beim Initialisieren laden können. Und wenn man ein paar Dinge beachtet ist dagegen auch nichts einzuwenden. Üblicher und Performanter ist natürlich immer sie vorher zu laden. Das steht vollkommen außer Frage.

DK99: Das Sinnvollste wäre in meinen Augen eine Verwaltung. Du kannst nicht bei jedem Renderdurchgang die Texturen laden. Das geht einfach nur noch auf die Performance. Du solltest also schauen welche Texturen du benötigst und diese bei Bedarf nachladen. Sollten einige Texturen nicht mehr benötigt werden (entweder direkt nach jedem Frame oder via Art Timer oder Speicherbegrenzung oder Kombi) dann musst du diese entladen. Und dazu hat Lord Horazont vollkommen recht musst du glDeleteTextures aufrufen.

Wenn diese Tiles klein genug sind, dann kannst es auch so machen, dass du zum Beispiel 16 Stück 64x64 Texturen in eine 256x256 Textur packst. Dazu dann glTexSubImage2D verwenden. Wenn ein Bereich nicht mehr benötigt wird kannst du ihn überschreiben. Dadurch hast du weniger Texturwechsel, weniger Texturerzeugungen/freigaben und es schmeckt nach Vanille. ;)

PS: Du solltest dir auch überlegen ob JPEG das richtige Format ist. Denn a) ist es verlustbehaftet und b) sehr Teuer beim Dekomprimieren und zur Laufzeit ist das nicht unbedingt so praktisch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 25, 2008 11:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wieso dein Speicher vollläuft ist sehr leicht zu erklären.
Du lädst in der Schleife alle Texturen immer wieder neu und löschst fein säuberlich die, im Speicher liegende, Textur.
Da du aber die Textur vorher in den Grafikspeicher lädst und beim nächsten mal nicht wieder löschst, hast du die Textur viele male doppelt.
Wenn der VRam nach ner weile voll ist, dann lagert der Treiber die am selten genutzten Texturen auf den Ram aus und dann läuft der auch voll.
Nun läuft der Speicher voll und wenn das passiert ist, werden die Texturen vom OS in die swapfile gepackt.
Zum schluss ist dein VRam,Ram,Swapfile mit vielen mehrfachen kopien der gelichen texturen zugemüllt und er findet keinen platz mehr, die neuen zu erstellen und die weißen Flächen kommen.
Die wohl einfachste Lösung ist ein kleiner simpler Texturmanager, dafür kannst du dir z.B. die Hashliste von Lossy Ex nehmen und dort die TexturIDs an den Texturnamen binden.
Wenn du eine Textur brauchst, dann guckst du in die Hashliste und wenn du kein Eintrag findest, lädst du die Textur und fügst die ID in die Liste.
Wie oben schon erwähnt wurde, kann man auch Texturen zusammenpacken(wenn sie klein genug sind) und auch kompremieren(via dds plugin für photoshop, gimp, ati tool, nv tool).
Eine gute Idee ist auch, nicht mehr gebrauchte Texturen wieder zu zerstören aber das wurde von mein Vorrednern ja schon erwähnt.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 25, 2008 12:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
OK also ersma vielen Dank für die Antworten. :)
Ich muss leider sagen dass ich noch ziemlich unerfahren mit OpenGL bin und desshalb eure Lösungen des Problems nicht so ganz verstanden habe :cry:
Könnte mir jemand nochmal erklären wie ich glDeleteTextures(n, textures); einsetzen kann und was ich dafür als n und als textures deklarieren muss?

Und kann mir dann jemand vielleicht auch nocheinmal möglichst einfach erklären wie man so eine Verwaltung oder Hashliste für die Texturen machen kann? (Ich muss leider sagen dass ich davon kein Wort verstanden hab, bin halt noch Anfänger).
Es wär ganz toll wenn ihr mir auch so Beispiel Befehle dafür geben könntet, weil ich die leider auch nich kenne :( .
MFG

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 25, 2008 12:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wenn du eine Textur erstellst, dann nutzt du ja glGenTextures(n,id), wobei n die anzahl an texturen und id der identifier ist, worüber du auf die Texturen zugreifen kannst.
Wenn du dann die Texturdaten, mit glTexImage2D, in den Grafikspeicher geladen hast, dann kann man über die ID nun die Textur erreichen.
Um die Textur wieder aus dem VRam zu bekommen und die ID frei zu geben, musst du glDeleteTextures(n,id) verwenden.
Also n gibt die Anzahl der zu löschenden Texturen an(1 bei dir) und id ist die ID die du beim erstellen bekommen hast.
Zum Thema Hashlisten hier mal ein Link.
Sicher nicht der Performanteste und sinnvollste Hashlisten Algo aber dafür funktioniert er und ist einfach zu bedienen.
So könnte der Anfang in etwa aussehen.
Code:
  1. var
  2.   tID:^cardinal;
  3.  
  4. getmem(tID,sizeof(cardinal));
  5. tID^:=ID;
  6. Hashliste.Add(TextureName,tID);
  7. ...
  8.  
  9. var
  10.   tex:^cardinal;
  11.  
  12. tex=Hashliste.Get(TextureName);
  13. if tex=nil then
  14. //lade textur neu und führe obiges snippet aus
  15. else
  16.   glBindTexture(GL_TEXTURE_2D,tex^);
  17.  

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 25, 2008 12:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zur Vereinfachung des Ganzen müsstest du auch nicht direkt mit Pointern arbeiten. Ein Pointer ist auch mindestens 32 Bit breit. Genau wie ein Cardinal. Und in dem Beispiel von Tak müsstest du diesen erstellten Pointer wieder löschen.

Code:
  1. var
  2.   ID: Cardinal;
  3.  
  4. Hash.Add('Name', Pointer(ID));
  5.  
  6. Cardinal(Hash.Get('Name'));

Ist vielleicht nicht der sauberste Stil aber spart einen Pointer ein und verhindert so Verwirrungen bzw Fehleranfälligkeit.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 25, 2008 15:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 09, 2008 16:28
Beiträge: 52
Wohnort: Münster
ok also ich muss leider sagen dass ich das immer noch nicht so ganz verstehe :(
Ist das was ihr oben geschrieben habt schon eine fertige prozedur für eine solche Liste oder muss da noch etwas dazugefügt werden? Und wo müsste ich das einfügen???
MFG

PS: Falls jemand von euch nen bissl Zeit hat wärs echt super nett wenn ihr in mein ganz oben genanntes Program diese Methode einbauen könntet und den Quelltext dann posten könntet :)

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."
-- Dan Salomon


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 15 Queries | GZIP : On ]