(gelöst) ID3DXFont oder eigene Font-Klasse

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

(gelöst) ID3DXFont oder eigene Font-Klasse

Beitrag von kkrahl »

Hätte da mal ein Frage:

Wie performant ist eigentlich ID3DXFont?

So weit ich weis wird da intern DXSprite verwendet, darum denk ich das das ganze nicht so performant ist. Ich hab ja auch DXSprite mit meiner eigen 2DTexture-Klasse ersetzt und konnte die Performance da um 60% steigern.

Hab auch mal versucht den Text in eine Texture als RenderTarget zu schreiben, was zwar wunderbar funktioniert hatte aber leider 95% meiner Performance kostete, bin da von vormals >1600 fps für die gleiche Szene auf 50 fps gefallen. Hatte da aber einmal pro sec die fps-Ausgabe neu erstellt, alle anderen Texturen waren statisch.

Meine eigentlich Frage ist nun, was ist eigentlich die beste und performanteste Methode um Text auszugeben? Will später auch Texte ausgeben bei denen ich einige Wörter oder Bereichen, wie Links, anders einfärben kann.

Danke für eure zahlreichen Antworten

Karl
Zuletzt geändert von kkrahl am 09.04.2009, 16:13, insgesamt 1-mal geändert.
Seraph
Site Admin
Beiträge: 1174
Registriert: 18.04.2002, 21:53
Echter Name: Steffen Engel

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von Seraph »

Ich kann Dir leider keine Antwort auf deine Fragen geben, da ich selbst an dieser interessiert bin. Was mich zusaetzlich noch interessiert ist, wie deine eigene 2D Texture-Klasse funktioniert, dass sie performanter als die DX-Sprite-Version ist.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von Krishty »

Ich wollte ja mal mit DirectWrite die vermutlich effizienteste Methode ausprobieren, habe im SDK aber weder Doku noch Sample noch Include gefunden … nur Online-Verweise auf Sample-Dateien, die es auf meiner Platte nicht gibt … habe ich da irgendwas falsch gemacht?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von kkrahl »

@ Steffen Engel:
Vorab gesagt die 60% beziehen sich auf mein 2DSample mit 16 Texturen, wobei beim messen ein Avr von 5 Läufen genommen wurde. Im Prinzip stelle ich nur sicher das alle 2DTexturen auf einmal gerendert werden. Habe dazu ein 2DTexturen-Klasse plus zugehörigen 2DRenderManager implementiert welcher nur einen Vertexbuffer und auch nur einen Indexbuffer für alle 2DTexturen benutz und diese dann in der richtigen Reihenfolge hintereinander (in einem Abwasch) herunter rendert. In meinem Fall verwende ich nicht nur einen Vertex- und Index-satz für alle 2DTexturen sonder pro 2DTexture einen da ich via den Farben der Vertizes unterschiedliche Hintergrundeffekte herstelle, kann daher auch unterschiedlich viele Vertizes pro 2DTexture haben (kA ob das so optimal ist oder ich ich lieber ein Textur-blending mit einer weitern Textur machen sollte).

Aber zurück zu meinem Problem das ich wie ich Glaube im Umschalten des RenderTragets liegt. Denn ich machen für das erstellen der Text-Textur folgendes:
  • OMSetRenderTarget auf die Texture
  • DrawText
  • OMSetRenderTarget auf das ursprüngliche RenerTarget
Da ich das im meinem Sample 1x pro Sekunde gemacht habe um die aktuelle FPS Ausgaben in eine Textur zu rendern denke ich das das die Ursache dafür sein könnte.

Werde als nächstes versuchen am Anfange eine Font-Matrix-Texture mittels einer Textur als RenderTarget zu erstellen, dies geschieht nur 1x pro Font. Diese Font-Matrix werde ich dann verwenden um manuel meine Textausgabe in eine Textur zu zeichnen. Ist wie vermutet wirklich das wechseln des RenderTargets schuld am meinem FSP Einbruch, von >1600 fps auf ~50 fps, so sollte ich dann eigentliche nicht weniger FPS haben als zuvor.

Bitte korrigiert mich wenn ich da irgendwie einen Denkfehler habe oder etwas gravierend falsch mache.

Verwenden hier eigentlich alle ID3DXFont?

mfg

Karl

Edit: Für meine 2DTextur-Klasse verwende ich übrigens mehrere unterschiedliche PS da 1x abfragen welcher PS verwendet werden soll performanter ist als im PS ein IF einzubauen was dann für jedes Pixel durchlaufen wird.
Zuletzt geändert von kkrahl am 31.03.2009, 16:33, insgesamt 2-mal geändert.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von Zudomon »

Ich werde das hinterher einfach mit Quads rendern, also ein Quad pro Buchstabe. Werde das dann in einem VB zusammenfassen, damit das nur ein Draw-Call ist. Eventuell werd ich das auch mit Instanzierung machen, wenn das dafür besser funktionert. Dadurch hätte man dann volle Dynamik, vor allem was auch Textfarbe oder Spezial-Effekte angeht.

Wichtig ist mir vor allem, dass der Text transformierbar ist und das man dann auch Shader darauf anwenden kann.
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von kkrahl »

Wollt das anfangs auch mittels Instanzing und mit Texture2DArray machen habe aber leider bisher kein brauchbares bzw. für mich verständliches Beispiel zu Instanzing gefunden womit ich dann zu mir bekannten zurückgreifen musste. Wenn da jemand ein gutes Bespiel hat wäre ich sehr dankbar.

Danke

Karl
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von Zudomon »

kkrahl hat geschrieben:Edit: Für meine 2DTextur-Klasse verwende ich übrigens mehrere unterschiedliche PS da 1x abfragen welcher PS verwendet werden soll performanter ist als im PS ein IF einzubauen was dann für jedes Pixel durchlaufen wird.
Ist das wirklich so? Sicher bin ich mir nicht, aber ich glaube, dass IFs, die nicht dynamisch sind, sowieso rausgezogen werden. Wenn z.B. ein IF von einem Boolean abhängt, der durch eine Konstante gesetzt wird, dann kann der sich ja niemals in einem DrawCall, geschweige denn von Pixel zu Pixel ändern und ist deswegen statisch.

Mach einfach mal einen Thread bzgl. Instancing, vielleicht wird dir ja geholfen ;)
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von kkrahl »

Bein meinen Messungen war der PS mit 2 Render-pfaden, wobei ich in meiner Applikation auch beide verwende, um ~5% langsamer als eine zuvor durchgeführte Shaderauswahl mittels IF und ~10% langsamer als ich den entsprechenden Shader mittels Shader-Array indiziert hatte.

Das war als ich noch 2 Render-pfade implementiert hatte, meine aktuelle Version hat sogar 3 Render-pfade und weite sollen folgen.

Karl
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von Zudomon »

Sehr interessant, hätte nicht gedacht, dass das Geschwindigkeitsunterschiede macht. Werde das in naher Zukunft auch mal testen! Danke für die Info :)
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von kkrahl »

Noch eine Frage in den Raum gestelt: Welche Erfahrungen hab ihr bisher mit OMSetRenderTarget und der Ausgabe in Texturen gemacht?

Hat jemand ne gute Instancing Anleitung?

Karl
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von kkrahl »

Hat ev jemand ne Ahnung warum wenn ich 2000 OMSetRenderTargets mache und immer zwischen 2 Targets wechsle 1999 Sets ca gleich lang brauchen aber das erste 10x länger?

Danke für euren Input

Karl
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: ID3DXFont oder eigene Font-Klasse

Beitrag von Krishty »

Weil die GPU erst zu arbeiten anfängt, wenn man Ergebnisse von ihr fordert … du schiebst 2000 Aufgaben in die Queue, aber abgearbeitet werden sie erst, wenn sie relevant werden … was durch irgendwelche Umstände (bedenk dass die GPU auch mal ein paar Frames hinterher hinkt) auf das eine OMSetRenderTargets() fällt.

Versuch mal zwischendurch den Device-Context zu flushen (::Flush()) … falls das nichts bringt (hatte ich auch schon), speicher zwischendurch mal ein Ergebnis in eine Datei (falls es die Performance erlaubt, also bei offline-Zeugs).
kkrahl hat geschrieben:Noch eine Frage in den Raum gestelt: Welche Erfahrungen hab ihr bisher mit OMSetRenderTarget und der Ausgabe in Texturen gemacht?
Dass es funktioniert? :D

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten