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

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

1

07.07.2006, 02:30

Diverse DirectX Fragen

Sorry dass ich schon wieder nen Thread aufmache, aber wenn man so ein Buch durcharbeitet kommen ne Menge Fragen auf, daher mal ein ganzes Array davon ;)

Frage[0]: Texturen werden mittels der Funktion CreateTextureFromFile(...) geladen. Woher weiss diese Funktion eigentlich um was fuer eine Bilddatei es sich handelt? Wird das ausschliesslich an der Dateiendung ausgemacht, oder kann die Fkt. den Dateityp erkennen?

Frage[1]: Ich erinnere mich irgendwo ein Tutorial gesehen zu haben, das Schriftarten per GDI implementiert. Ich kann mir kaum vorstellen dass kommerzielle Spiele eine Textausgabe per Bitmap-Font verwenden. Gibt es noch weitere Alternativen, oder wird immer eine dieser beiden Varianten verwendet?

Frage[2]: Mir ist immer noch unklar wann genau Release() aufgerufen werden muss - Es wird ja ein Referenzzaehler verwendet wird um Texturen nicht doppelt zu laden. Aber wenn ich zb einen Texturzeiger (PDIRECT3DTEXTURE9) kopiere, wird doch der Referenzwert der Schnittstelle nicht erhoeht. Wenn jetzt mehrere "Objekte" diesen Zeiger verwenden, und eins davon ruft die Release()-Funktion auf, zeigen die andern doch auf eine nicht mehr existierende Schnittstelle.

Frage[3]: Eng verbunden mit der vorherigen Frage: Erhoeht SetTexture() den Referenzwert der Texturschnittstelle? Sollte dies der Fall sein, erkenne ich den Sinn dahinter nicht. (Es sei denn, man setzt eine Texur, will sie dann leoschen und dann rendern.. aber das kommt mir sehr abwegig vor)

Ich hoffe ich habs nicht wieder komplizierter gemacht als es ist - Ein hilfreicher Link wuerde mir schon reichen
:D
"Have you tried turning it off and on again?"

alexm

Frischling

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

2

07.07.2006, 08:03

[0]: Hab in der DX-Doku nachgesehen - 'wer' das erkennt, geht eigentlich
nicht hervor. Demnach, dass es aber das D3DXIMAGE_FILEFORMAT gibt,
gehe ich davon aus, dass die Funktion D3DXCreateTextureFromFile
das überprüft.

[1]: Ja doch, siehe ID3DXFont - da kannst du normale TTF Fonts
rendern

[2]: Wild Pointers ... naja das hängt natürlich total mit deinem Codeaufbau
zusammen. Release() solltest demnach beim beenden Deines "Renderers"
aufrufen, sprich ab dort, wo Du genau weisst, dass niemand mehr
Zugriff auf die Texturen hat.

[3]: Da steht in der Doku nichts darüber, eigenartigerweise aber bei
GetTexture:

Zitat

Calling this method will increase the internal reference count on the IDirect3DTexture9 interface. Failure to call Release when finished using this IDirect3DTexture9 interface results in a memory leak.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

07.07.2006, 08:40

Dateien haben oft einen Dateiheader. Das sind die ersten paar bytes an Informationen, die in der Datei gespeichert sind. Anhand dieser Daten kann man erkennen um welchen Dateityp es sich handelt. Release zerstört nur dann die Schnittstelle, wenn der Referenzcounter gleich 0 ist. Man sollte daher sehr vorsichtig mit Kopien des Zeiger umgehen. Am besten man erhöht den Refcounter mit AddRef um solche Probleme wie Zeiger ins nichts zu vermieden. Natürlich muss man auch für jedes AddRef später ein Release aufrufen ;). Das mit der Tatsache, das SetTexture den Refcount erhöht, ist einfach eine Sicherung gegen Deppen.Damit ist sicher gestellt, dass die Textur nicht einfach verschwindet, nur weil der Programmierer irgendwo ein Release aufruft und dadurch dem Renderer einen Zeiger ins Leere hinterlässt.
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.

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

4

07.07.2006, 14:50

Jup, das hat mir geholfen. Merci beaucoup :)

PS: Aber ID3DXFont verwendet intern auch sowas wie Bitmap-Fonts oder?
"Have you tried turning it off and on again?"

Werbeanzeige