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

Paddy

Frischling

  • »Paddy« ist der Autor dieses Themas

Beiträge: 15

Wohnort: Essen

  • Private Nachricht senden

1

23.11.2006, 00:24

Textur laden ohne d3dx9

Hi Leute,

ich lese zwar überall,dass die D3Dx9 Routinen so langsam sind, ich finde aber nirgends einen Ansatz zu der "schnelleren" Variante.

LPDIRECT3DTEXTURE9 ist ja denke ich bei beiden gleich.
Aber was macht die "schnelle" Variante besser?
Die Lese/schreibzugriffe werden doch so oder so quasi über den selber C++ code erledigt...
Was soll den Performance bringen? Das ich die Header überspringe, da ich ja schon weiß wie die Dateien aufgebaut sind und ich direkt anfangen kann die Daten zu laden? Gibts sonst noch n Vorteil?
Wenn ich eine 256 Bitmap laden will, mach ich das dann mit nem 256x256x3Word großen Array, bei dem ich bei bmps den Header überspringe und die Zeilen vom Array von hinten nach vorne adressiere?

Und vor allem:
Mit welchem Befehl kopiere ich die Daten in den Texturespeicher?

Sorry Leute für so ein Ge'Noob'e, aber ich steh im Mom. wirklich etwas auf dem Schlauch.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

23.11.2006, 00:45

De facto ist D3DX nicht langsam, weil da Leute dran sitzen, die sowas nicht erst seit nem Jahr entwickeln. Wenn man also die schlagen will, muss man entweder an manchen Stellen trixen auf die Gefahr hin, dass es mehr Fehlerquellen gibt oder wirklich verdammt gut sein. Nutz daher lieber die Zeit für andere Sachen. Wenn du es allerdings aus reinem Lerneffekt machen willst:
Schau dir an wie man eine Bitmap läd(BITMAPINFOHEADER, BITMAPFILEHEADER) und dann wie man einen Buffer(in diesem Fall eine Textur) in D3D erstellt und befüllt.
(Meine Meinung)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Paddy

Frischling

  • »Paddy« ist der Autor dieses Themas

Beiträge: 15

Wohnort: Essen

  • Private Nachricht senden

3

23.11.2006, 04:31

Ich suche halt die Stelle, an der man beschleunigen kann...
Sinn und Zweck: Mir einen Optimierungsdeckel machen, wenn nachher Speed fehlt und ich die andere Variante rausschmeißen will. Das Langsamste sind halt immer noch die Festplattenzugriffe (und auch das was sich Performancemäßig am wenigsten über die Jahre verändert hat).
Da mein Spielekonzept eine großes "Level" vorsieht, also keine Zwischenladescreens werd ich natürlich versuchen möglich viel bei Programmstart in den RAM zu laden und in ruhigen Zeiten per Thread Chunkweise mögliche Zukünftige Bereiche bereits vorzuladen, damit nachher nur aus dem RAM in die Karte geschoben werden muß, aber kritisch wird da jeder Ladekram wahrscheinlich immer noch werden.

Lösungsansätze:
Also wenn man die Dateiendung mit dem Fileformat koppelt, dann würde mir spontan einfallen, was ich da machen könnte:

filename.XYZ

Buchstabe X wird ersetzt durch Bezeichner für 16er Potenz der Auflösung
A = 16, B= 32, C=64, D=128, E=256, F=512....
Und Y stellt die Bitrate da
A = 16 mit 5.6.5, B= A1.5.5.5 etc...

So kann ich mir einladen und auswerten des Headers zur Laufzeit sparen, damit das Laden des Header auch und die Bilddatei als PlainData speichern, da der Header vorher rausgenommen werden kann. Im Vergleich zur Bitmap kann ich auch im Vorfeld die Daten schon drehen, da ne BMP ja upside down gespeichert wird und damit die eingelesenen Daten direkt verarbeiten ohne vorher drehen zu müssen. Damit wären alle Formatfragen schon beim aufrufen der Funktion/Member geklärt, da außer einem Len und dem Angeben von
loadtexture(filename, filename[len -3], filename[len -2]) und einem Switch in der Funktion nix gerechnet werden muß (der Rest besteht dann aus reinen Lade- und Zuweisungsoperationen.

Es mit InlineASM auf die Spitze zu treiben hatte ich allerdings nicht vor :D

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

23.11.2006, 08:17

Ganz ehrlich, den Header zu überspringen um Leistung zu sparen, ist mal ne ganz doofe idee. Das sind viell. nur eine Hand voll Instruktionen, die du damit einsparst. Viel sinnvoller wäre eine geschickte Gestaltung des Ladealgos für dein Terrain. Darin solltest du die Zeit investieren!
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

23.11.2006, 10:15

Ich denke dasselbe wie Nox: Die Auswertung der Dateiendung wird wohl nicht schneller sein als die Auswertung der Header-Informationen.
Zumal Du ja die Header-Informationen aller in Frage kommenden Dateien "vorladen" kannst, um die entsprechenden Bilddaten bei Bedarf nachzuladen. Das nimmt nicht viel Platz weg, da diese Header-Blöcke nur ein paar Byte lang sind. Vielleicht wertest Du diese Header-Informationen aus und konvertierst sie noch in ein adäquates, noch kleineres Format.
Anhand dieser vorgeladenen Informationen kannst Du ja per Funktionszeiger oder einer anderen Technik schon im Vorfeld auf die entsprechende Ladefunktion verweisen, so dass diese nur noch gestartet wird. Effektiv hättest Du dann nur noch einen 4-Byte-Funktions-Pointer zu speichern und ggf. ein paar Parameter. Wenn letztere in Form von "Flags" vorliegen, sind das nochmal 4 Byte -- maximal.

[edit]PS: Nur so eine Idee. Ich habe es selbst noch nie so realisiert, aber in dem Falle würde ich diesen Ansatz auf jeden Fall mal weiter denken. Vielleicht bringt's ja was...
Kommen Sie nie mit einem Schwert zu einer Schießerei.

Werbeanzeige