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

Aktuelle Zeit: Mi Jul 16, 2025 22:50

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Jan 21, 2004 11:50 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Moin,

ich bau momentan mir nen Breakout/Krakout Klon zusammen.
Hab mir da für den grafischen teil paar klassen gebaut, einmal ne klasse um Unbewegliche Polys anzuzeigen (vertices, faces, objects)
TR3DWorld

einmal ne klasse um Bewegliche Polys anzuzeigen (vertices, faces)
TR3DMesh

dann ne Klasse der als TextureManager dient, also ne schöne TList wo die
Texture Infos gespeichert werden...
TR3DTextureManager

dann gibts ne Klasse die referenziert, welche Texture wo und wann verwendet wird, sogenannte "Shader" bei mir, ähnlich wie beim Quake III Arena.
TR3DShaderManager

So, nun ist es so, das TR3DWorld und TR3DMesh jede ihre eigenen TextureManager und ShaderManager mitbringt.

Das ist scheisse, wenn man in beiden ne gleiche texture doppelt laden muss, somit Speicher verschwendet.

Bei den Shadern ist es eigentlich egal, da würde ein Globaler ShaderManager reichen und müsste es nicht doppelt laden, ok ein problem beseitigt...

Nur wie ist es mit den Texturen, ich will eigentlich nur die Texturen laden wenn sie auch wirklich gebraucht werden, also bei Mapwechsel sollten alte Texturen rausgehauen, (AUSSER) die Player Texturen die man nich raushauen muss, oder sachen wie ne Normalization Cubemap, Attenuation, Font map etc.

Später natürlich müssen noch steine dazu und die greifen vielleicht auch auf die selben texturen zu wie ne TR3DWorld.

Wie wäre es also sinnvoll die TextureManager zu verteilen/synchroniesieren usw...

Am liebsten wäre mir ein TextureManager, aber wie ich da das ganze organisiere hab ich kein plan.

Wäre dankbar wenn ihr mir ratschläge geben könntet.


matane,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 21, 2004 12:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hast du dir schon mal an Hashes angesehen? Das ist so ähnliche wie eine Liste nur mit dem Unterschie, dass du auf die Einträge blitzschnell per Name zugreifst. Wenn du diese Global machst kannst du jederzeit darauf zugreifen und doppelte Einträge sind dabei ausgeschlossen.
In deiner Map könntest du so die Namen der Texturen vermerken und diese würden dann nur geladen werden wenn sie sich nicht im Hash befinden. Das Herrausfinden der nicht mehr benötigten Texturen müsstest du selber tun. Aber das sollte nicht so schwer sein.

PS: Bei Compiler werden Hashs auch gerne für die Variablen verwendet.

Ich habe da schon mal was vorbereitet. ;-)
http://www.dev-center.de/index.php?cat=header&file=hash


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 21, 2004 12:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Wieso instantiierst du zwei Texturmanager?
Definiere halt die Klasse, lege eine globale Instanz davon an, und gib sämtlichen Klassen die Zugriff darauf brauchen, einen Zeiger drauf mit.
Macht Delphi ja genau so, wenn du z.B. ein Formular anlegst: du hast die Klasse und gleichzeitig eine Instanz davon.

Wenn du nicht mehr benötigte Texturen frei geben willst, macht das auch die Texturklasse - wenn irgend etwas eine Textur anfordert, lädst du diese und setzt einen Referenzzähler auf eins, bzw. zählst diesen rauf, wenn sie schon geladen ist. Sagt etwas, die Textur wird nicht mehr benötigt, zählst du diesen runter - erreicht er 0, kannst du die Textur freigeben.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 21, 2004 12:31 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Oder mach eine globale Liste für alle Ressourcen und leite dann eben die verschiedenen Arten von Ressourcen von einer Basisklasse ab. Mit Ressourcen sind alle Objekte gemeint, die von mehreren Objekten gemeinsam genutzt werden,einen Namen,einen Referenzzähler haben und externe Objekte initialisieren bzw. später wieder freigeben. Das können sämtliche OpenGL Objekte,Texturen, Vertex Buffer, Shader aber auch Sounds, Modelle und ihre entsprechenden Variationen sein.
Wenn du ein Objekt benötigst, dann läst du es über die globale Ressourcenliste erstellen und laden
obj:=RessourceList.LoadRessource(Klassenname,Ressourcenname), so daß du dann kontrollieren kannst,daß ein Objekt nicht doppelt erstellt wird. Zum Schluß wird dann mit obj._Release die Referenz wieder freigeben und die Ressource löscht sich wieder aus der Liste, falls es die letzte Referenz war. Man muß nur aufpassen, daß sich bei den Referenzen kein Kreis bildet und sich ein Objekt indirekt oder direkt selber referenziert. Aber das sollte hier meistens nicht der Fall sein. Auf diese Art und Weise kannst du all die verschiedenen dynamisch ladbaren Objekte in einer Engine auf gleiche Art und Weise verwalten.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.008s | 16 Queries | GZIP : On ]