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

Aktuelle Zeit: Mi Jul 16, 2025 09:46

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texturen Performance Problem
BeitragVerfasst: Mo Apr 14, 2008 16:53 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 26
Hallo, alle zusammen !!

Ich habe ein Problem mit der Geschwindigkeit des Texturen-Loaders: Es dauert vergleichsweise lang bis meine Texturen geladen werden (ca. 1-2 sec), was gerade in diesem Fall seeeehr schlecht ist. Die Texturen sind allerdings relativ groß (2048x1024).
Hier sind Teile des Codes:

Code:
  1.  
  2. glBindTexture(GL_TEXTURE_2D, TexID[1]);
  3.      tex := IMG_Load(Pchar(path  + IntToStr(number2) + '.JPG'));
  4.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  5.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  6.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  7.     SDL_FreeSurface(tex);
  8.  
  9.  


Dieser Code wird sechs mal ausgeführt (natürlich mit unterschiedlichen texturen)

Ich verwende noch eine Blend-textur, welche immer geladen wird und auf die sechs texturen angewandt wird


Code:
  1.  
  2. glBindTexture(GL_TEXTURE_2D, BlendID);
  3.   Tex := IMG_Load(Pchar(applicationpath+ '\blend2.jpg'));
  4.   GetMem(Buff, Tex^.w * Tex^.h);
  5.   RedToAlpha(Tex, Buff);
  6.  
  7.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  8.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  9.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  10.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  11.   glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, Tex^.w, Tex^.h,0, GL_ALPHA, GL_UNSIGNED_BYTE, Buff);
  12.    FreeMem(Buff);
  13.    SDL_FreeSurface(Tex);
  14.  
  15.  


Gibt es eine Möglichkeit, die Textur schneller zu laden????
Vielen Dank für eure Hilfe!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 17:35 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Jein. Du kannst sie machimal früher laden in einem extra Thread.

Dann gibt es noch die möglichkeit die texturen kompremiert zu laden. Da ist aber Lossy der Spezialist.

Es dauert nunmal seine Zeit die Daten an die Graka zu schleusen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 18:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Warum ist der Vorgang denn so zeitkritisch? Vielleicht kann man da was optimieren, oder die Textur in kleinere Aufteilen und dann schrittweise laden.

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: Mo Apr 14, 2008 18:43 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 26
mmmh, naja, Teilen kann ich die Textur leider nicht.

Das mit dem Thread hatte ich mir auch schon überlegt, hatte aber das Problem, dass ich andauernd eine Zugriffsverletzung verursacht hatte.
Welche Bereiche oder welchen Vorgang muss man denn beim laden synchronisieren ????


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 19:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Es dauert so lange weil du als Format JPEGs benutzt. Das ist beim Dekomprimieren sehr zeitintensiv. So etwas wie TGA, BMP ist unkomprimiert. Dadurch aber um einiges größer aber das Laden sollte schneller gehen.

Als erstes. Benötigst du Threads überhaupt? Speziell, wenn du eher weniger Erfahrung mit Threads hast ist es mitunter besser sie wirklich nur einzusetzen, wenn du sie wirklich brauchst.

Synchronisieren. Nach Möglichkeit so gut wie gar nichts. Synchronisieren ist immer ein blockieren und dadurch wird die Geschwindigkeit reduziert. Ich hab schon Konstrukte von erfahrenen Entwicklern gesehen die die vorteile Threads vollkommen aussynchronisiert hatten.

Zur generellen herangehensweise. Du solltest die Klasse TThread benutzen und im Execute das Bild laden. Und zwar nur den SDL Teil. Also das IMG_load. Das geladenen Surface speicherst du in einer Klassenvariable des Threads. Zum Erstellen deiner Textur solltest du das OnTerminate des Threads benutzen. Das wird automatisch synchronisiert und dann aufgerufen, wenn der Thread fertig ist. Im OnTerminate baust du dann alle OpenGL Funktionen rein die zum Erstellen nötig sind.

Du musst natürlich auch dafür sorgen, dass du nicht stumpf die Texturen vorraussetzt sondern auch überprüfst ob sie bereits vollständig geladen wurden. Es könnte nämlich sein, dass das laden etwas länger dauert.

Als Lektüre für Threads solltest du dir auch mal das Threadtutorial anschauen. Wobei die besonderen Synchronisierungegeschichte in dem Tutorial sind für dich auch nicht notwendig. Das OnTerminate sollte ausreichen. Sofern SDL_image und SDL Threadsafe sind. Das weiß ich nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 20:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Die beste Lösung für dein Problem ist das DDS Format, mit DXT1,3,5 und 3Dc(ATI2).
Deine GPU kann die codecs Hardwaremässig, daher wird die textur in ihren zustand belassen und in den Grafikspeicher direkt geladen.
Der vorteil der Formate sind sehr schnelles laden(kein konvertierungsprozess notwendig und die Daten gehen kompremiert über den Datenbus), höhere Performance(das Format kann mit einen Texelzugriff mehere Texel errechnen und der Transport von VRAM in Cache ist kürzer) und weniger VRAM,RAM,CPU,GPU und Datenbus benutzung. Ideal ist es, ATI2 zu nehmen und wenn dieses von der Graka ned supported wird, die Textur auf DXT5 zu konvertieren. ATI2 bietet bessere Bildqualität wird aber erst seit der ATI 8600 und bei GF glaube erst ab der gf5 Reihe(per software konvertierung auch auf älteren Karten verfügbar) supported.

_________________
"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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.008s | 16 Queries | GZIP : On ]