Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

1

06.08.2008, 10:19

Umgang mit großen Texturen

Hallo,

in Davids Buch steht ja, dass man sich besser nicht zu sehr auf die Fähigkeiten einer Grafikkarte in Bezug auf Texturen verlassen und daher nur quadratische, deren Höhe und Breite Zweierpotenzen sind, verwenden sollte. Wo liegt denn die Grenze nach oben, bis zu der man "blind" von einer Unterstützung ausgehen kann? 256x256, 512x512 oder gar 1024x1024?

Wie gehe ich damit insbesondere dann um, wenn ich Texturen als zweidimensionale Sprites zeichnen, jedoch nicht verzerrt, sondern in Originalgröße abspeichern will? Soweit ich weiß sollte man "krumme" Texturen dann auf die nächst größere Größe aus der obigen Reihe "stretchen". Hat jemand dazu ein Tutorial oder einen Sourcecode? :)

Doch was macht man, wenn man beispielsweise einen Hintergrund von 800x600 als Sprite zeichnen möchte? Die nächste Größe wäre dann wohl 1024x1024, aber was, wenn diese nicht Standard ist (daher meine Frage oben)? Wie geht die Kombination D3DXCreateTextureFromFile - ID3DXSprite (die ich nur ungern verwenden möchte) damit um?

Gruß,
ph4nt0m

p0llux

Treue Seele

Beiträge: 101

Wohnort: Aachen

Beruf: HiWi (theo. Inf.)

  • Private Nachricht senden

2

06.08.2008, 10:55

Hi,

Einerseits unterliegt das ganze natürlich der Größe des Addressraums der Grafikkarte (welche man vermutlich nur tief in den technischen Daten einer Grafikkarte finden wird). Darüberhinaus habe ich schon an einigen Stellen gelesen, dass es zu kleineren Performanceeinbrüchen kommt, falls man zu kleine/große Texturen verwendet. Empirisch bestätigt habe ich sowas aber bisher noch nicht.

Andererseits ist es auch kein Problem mehrere Texturen zu verwenden - Das machen viele Spiele so ;). Hierzu solltest du allerdings die grafischen Elemente so auf den Texturen verteilen, dass du die Anzahl von Texturswitches minimierst, da diese Switches verhältnismässig teuer sind.

Der Vorteil ist, dass man solche algorithmischen Optimierungen verhältnissmäßig früh im Programmcode durchführen kann. Du könntest dir z.B. anschauen, in welcher Reihenfolge du die verschiedenen Spielelemente renderst und sie in dieser Reihenfolge (Z.B. Hintergrund, Weltobjekte, Objekte, Spielfiguren, Effekte, etc.) in die entsprechenden Texture auslagerst.

Was die D3D-Funktion angeht, musst du wohl in die entsprechende Referenz schauen. Ich würde vermuten, dass die Funktion abhängig von den Fähigkeiten der Grafikkarte handelt. DX ist im Allgemeinen recht intelligent geschrieben.

Darüber hinaus kannst du einen 800x600 Hintergrund natürlich zusammen mit anderen Sprites auf die selbe 1024er Textur legen.

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

3

06.08.2008, 11:19

Zitat

und sie in dieser Reihenfolge (Z.B. Hintergrund, Weltobjekte, Objekte, Spielfiguren, Effekte, etc.) in die entsprechenden Texture auslagerst

Zitat

Darüber hinaus kannst du einen 800x600 Hintergrund natürlich zusammen mit anderen Sprites auf die selbe 1024er Textur legen.

Das verstehe ich nicht ganz: Wie genau meinst du das mit mehreren Sprites auf nur einer Textur? :) Meinst du, ich soll nur ein Texturinterface anlegen, aber in dieses dann nacheinander die verschiedenen Grafiken kopieren und zeichnen? Ich kann mir ehrlich gesagt nicht vorstellen, dass das sehr effizient ist, aber es war vielleicht auch anders gemeint ;)

Eigentlich ging es mir mehr darum, wie ich eine einzelne 800x600 Grafikdatei (von anderen Spielelementen mal abgesehen) als Textur ablege, um diese dann über zwei Dreiecke zu legen: Soll ich sie auf 1024x1024 strecken? Und kann ich dann überhaupt davon ausgehen, dass auch etwas ältere PCs mit dieser Größe klar kommen?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

06.08.2008, 11:42

Zitat von »"ph4nt0m"«

Das verstehe ich nicht ganz: Wie genau meinst du das mit mehreren Sprites auf nur einer Textur? Smile Meinst du, ich soll nur ein Texturinterface anlegen, aber in dieses dann nacheinander die verschiedenen Grafiken kopieren und zeichnen? Ich kann mir ehrlich gesagt nicht vorstellen, dass das sehr effizient ist, aber es war vielleicht auch anders gemeint Wink


na hallo, und wie das performance bringt! je weniger changes der texturen desto besser^^. und wenn du alle graiken in eine textur packst sparst du wirklich viel, das war genauso gemeint wie dus verstanden hast

Zitat

Eigentlich ging es mir mehr darum, wie ich eine einzelne 800x600 Grafikdatei (von anderen Spielelementen mal abgesehen) als Textur ablege, um diese dann über zwei Dreiecke zu legen: Soll ich sie auf 1024x1024 strecken? Und kann ich dann überhaupt davon ausgehen, dass auch etwas ältere PCs mit dieser Größe klar kommen?


ne strecken würde ich nicht. erweitere die texur einfach auf 1024x1024 und mappe die tex-coords neu. die meisten grakas erweitern übrigens auf die nächsthöhere 2^2 potenz, wenn duie größe nicht stimmt, also da musste dann eigl nix machen. ich weiss nur nich inwieweit das umgesetzt wird

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

5

06.08.2008, 12:04

Zitat

na hallo, und wie das performance bringt! je weniger changes der texturen desto besser^^. und wenn du alle graiken in eine textur packst sparst du wirklich viel, das war genauso gemeint wie dus verstanden hast
Aber warum soll ID3DXSprite dann z.B. so schnell sein? Dort muss man doch bei jedem Aufruf von Draw eine Textur angeben. Wenn ich nun aber nur ein Textur-Interface habe, dessen Inhalt ich immer ändere, müsste ich ID3DXSprite ja wahrscheinlich durch Flush() dazu bewegen, sofort zu zeichnen und damit wäre doch der eigentliche Sinn des "Zeichnens in einem Rutsch" dahin, oder nicht?

Und wie sollte ich dann überhaupt eine Art Textur-/Spritemanager realisieren? Bisher habe ich für jede Grafik immer eine separate Textur erstellt und diese in einer map gespeichert. Soll ich stattdessen nur die Bilddaten an sich in der map ablegen und beim Aufruf von Draw() dann diese in ein IDirect3DTexture9, das für alle verwendet wird, kopieren?

Gruß,
ph4nt0m

jojendersie

Frischling

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

6

06.08.2008, 16:43

Wer sagt denn, dass ID3DXSprite so schnell sein soll? Na gut DX10 ist jetzt schon ganz gut, aber OpenGL ist in jedem Falle schneller als DX9^^.

Zitat

Und wie sollte ich dann überhaupt eine Art Textur-/Spritemanager realisieren?


Ok, was genau?? Textur und Sprites sollte man gesondert behandel, ein Texturmanager lädt und optimiert beim Rendern vielleicht, das sie nicht so oft gesetzt werden. Spritemanager sind da ja eher für Transformationen und massig kleiner 2D Flächen gedacht.

1. Hintergründe
Einen Hintergrund würde ich auch einfach in 800x600 speichern(, die älteste Graka, die mir unter die Augen gekommen ist war eine Geforce 5 und ein equivalentes Radeon Model die konnten das).
Dann einfach laden und mit DrawPrimitive einfach untransformiert(FVF-D3DFVF_XYZRHW) 2 Dreicken zeichen. (Koordinaten: 0 0, 0 1, 1 0, 1 1 und Textur genauso 0 0,...)

2. Sprites in einer Textur
Beispiel: du hast 2 verschiedene Sprites mit 64x128 und 64x64, dann kannst du sie in eine 128x128 Textur stecken und dann beim Rendern einmal die Texturkoordinaten X: 0 - 1 Y: 0 - 0.5 und einmal x:0 - 0.5 y: 0.5 - 1 verwenden. Dann muss nur eine Textur gesetzt werden, und das ist schneller.

Anonymous

unregistriert

7

06.08.2008, 17:15

Zitat von »"jojendersie"«

Na gut DX10 ist jetzt schon ganz gut, aber OpenGL ist in jedem Falle schneller als DX9^^.
Selbst ich als eingefleischter OpenGL-Coder kann solch lächerliche und minderwertigen Kommentare in keinster Weise unterstützten! Du machst dich mit sowas zu einer regelrechten Schande für die ganze OpenGL-Szene und man kann echt nur noch den Kopf schütteln, wenn man sieht das solche Kommentare noch immer gepostet werden.

Schäm dich und überleg mal was du für einen geistigen Dünnschiss du da von dir lässt. Sorry, aber über sowas kann man echt nur noch den Kopf schütteln.

jojendersie

Frischling

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

8

06.08.2008, 17:34

Sorry, wo ist mein Fehler?
Ich frage jetzt wirklich aus interresse. Jedes OpenGL Programm, welches ich gesehen habe war schneller als alle die ich in DX gesehen habe (und damit meine ich die, die das Haargenau gleiche Ergebnis haben!!)

Anonymous

unregistriert

9

06.08.2008, 17:40

jojendersie
Das Ergebnis, das solltest du als Coder wissen, ist absolut uninteressant. Der Weg dahin ist relevant!

Bist du dir auch nur ansatzweise darüber im Klaren, das dutzende Faktoren für die Geschwindigkeit zusammentreffen und nicht nur eine popelige API-Spezifikation?

- Treiberimpelementierungen
- Hardwareimpelementierungen
- Softwareimplementierungen
- Implementierung der Programme (z. B. VBOs und D3D VertexBuffer, Shader, FFP usw.)
- Unterschiedliche Implementierung der FFP/TNL oder von Shadern
- Unterschiedliche Implementierung der OpenGL/Direct3D Spezifikationen für die Grafikkarte
- Implementierung des Speichermanagements sowohl auf GraKa, Treiber, Betriebssystem als auch in dem Beispielprogramm
- uvm.

So blöden Kommentar reißen von wegen "Ist schneller als XYZ" ist GameStar- und PC-Games-Niveau und nichts für Coder.

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

10

06.08.2008, 17:48

Ich möchte mehrere Grafiken zweidimensional auf den Bildschirm bringen. Die Bilddateien liegen alle einzeln in korrekter Größe und mit korrektem Seitenverhältnis vor. Mit Manager meinte ich nun beispielsweise ein Singleton, der die Grafiken verwaltet, also speichert und bei einem Aufruf von Draw() schließlich an einer beliebigen Position zeichnet.

Der Loader für das verwendete Dateiformat sowie das mappen auf zwei Dreiecke ist kein Problem, doch das habe ich aktuell nur in einer Funktion für eine einzelne Grafik ausprobiert. Mir fehlt aber die Idee, wie ich das ganze nun "komfortabel" in eine Klasse packen soll:

  1. Die geladenen Daten müssen ja irgendwie gespeichert werden. Sollte das in "Rohform" oder bereits als IDirect3DTexture9 gemacht werden?
  2. An der Stelle, wo letztendlich die Textur erstellt wird, wie gehe ich dort mit den unterschiedlichen und "krummen" Größen meiner Bilddateien um? Meine Grafikkarte scheint das zwar zu schlucken, aber kann ich davon allgemein ausgehen?
  3. Ist es sinnvoll das Ganze in einer Klasse zu realisieren oder soll ich eine ID3DXSprite-ähnliche, die nur für das Zeichnen zuständig ist, erstellen (und damit das Laden in einer weiteren Klasse implementieren)?
ph4nt0m

Werbeanzeige