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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

09.01.2014, 20:31

Shader-Ressourcen in DirectX 11

Ich bin im Moment ein wenig am herumprobieren, ob ich mit Effects11 oder direkt auf dem Geräte-Kontext arbeiten soll. Ich habe dazu ein paar Fragen.
1. Warum fällt meine Framerate von 1600 auf 300 wenn ich nichts zeichne, sondern nur mit Effects11 eine Textur an den Shader sende(SetResource)?
2. Ist Effects11 langsamer als das direkte arbeiten mit dem Geräte-Kontext? Ich fand folgenden Code in Effects11, um eine Textur an den Shader zu senden:

C-/C++-Quelltext

1
2
3
4
// Texture variables don't need to be dirtied.
    SAFE_ADDREF(pResource);
    SAFE_RELEASE(Data.pShaderResource->pShaderResource);
    Data.pShaderResource->pShaderResource = pResource;

Das ganze wirkt mir ein wenig überladen, um es jedesmal aufzurufen, damit eine neue Textur gebunden wird.
3. Ist es möglich mit Effects11 zu prüfen, ob eine ganz bestimmte Textur gebunden ist? Oder sollte man sich eine Klasse schreiben, die beispielsweise eine ID3D11ShaderResourceView Variable widerspiegelt, damit man prüfen kann, ob die Textur schon gebunden ist?
4. Ist es möglich zu überprüfen, ob eine bestimmte Textur gebunden ist, ohne Effects11 zu nutzen? Also PSSetShaderResources(...)? Ist dies auch in einer akzeptablen Geschwindigkeit möglich?
5. Ist es möglich eine Textur mittels PSSetShaderResources an die Pipeline zu binden und sie dann mit zwei verschiedenen Shadern zu nutzen? In etwas so:

C-/C++-Quelltext

1
2
3
4
5
deviceContext->PSSetShaderResources(0, 1, &texture);
deviceContext->PSSetShader(shader1, NULL, 0);
// zeichne was
deviceContext->PSSetShader(shader2, NULL, 0);
// zeichne was


Danke für mögliche Antworten!

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (09.01.2014, 20:39)


patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

2

09.01.2014, 21:10

Zu 1.:
Von 1600 FPS auf 300 FPS sind es nur 0,0027s. So viel ist das nicht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

10.01.2014, 08:16

4. Ist es möglich zu überprüfen, ob eine bestimmte Textur gebunden ist, ohne Effects11 zu nutzen? Also PSSetShaderResources(...)? Ist dies auch in einer akzeptablen Geschwindigkeit möglich?


Du könntest die gebundenen Ressourcen abfragen (PSGetShaderResource). Allerdings ist es im Zweifel einfacher/schneller selbst den Status mitzuführen.

5. Ist es möglich eine Textur mittels PSSetShaderResources an die Pipeline zu binden und sie dann mit zwei verschiedenen Shadern zu nutzen?


Alle Ressourcen bleiben an die Pipeline gebunden auch wenn sich der Shader ändert. Du musst vielmehr dafür sorgen, dass unnötig belegte Slots wieder freigegeben werden.

Zu 1.:
Von 1600 FPS auf 300 FPS sind es nur 0,0027s. So viel ist das nicht.


Im "Framezeit-Dimensionen" sind 2.7 Millisekunden schon sehr viel, da gehts um jede Millisekunde! :)
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

10.01.2014, 11:16

2. Ist Effects11 langsamer als das direkte arbeiten mit dem Geräte-Kontext?

Effects11 ist nur eine Library, die intern nichts anderes tut als D3D zu verwenden. Natürlich ist dies mit gewissem Overhead verbunden...

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

10.01.2014, 14:35

Ich verwende auch die Effects11 Library und finde sie ziemlich praktisch, weil sie einem am Anfang viel abnimmt. Ich finde es auch Schade, dass es kaum gute Ressourcen zum implementieren eines Shadersystems ohne Effects11 gibt...ich finde zumindest kaum welche.

Die Performanceeinbußungen kann ich dir leider nicht bestätigen, aber schaue dir auch deine Ausgabe an, ob es Warnings gibt. Bei mir waren auch vor allem die Unterscheide Debug/Release groß. Vielleicht ist der Drop in Release marginal.

Ansonsten gilt wie bei allen D3D-Aufrufen: Selber aktuellen Wert cachen und ggf. setzen oder nicht setzen. Effects11 legt intern Constant Buffers an, darauf hast du keinen Einfluss. Ich vermute aber, dass Effects11 bei Apply() alle Constant Buffer aktualisiert, was ja nicht immer gewünscht ist.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

6

18.01.2014, 14:49

Ich habe noch ein paar Fragen:

Du musst vielmehr dafür sorgen, dass unnötig belegte Slots wieder freigegeben werden.

So etwas dachte ich mir schon.
Kann ich dann einfach ein Array von nullptr's per PSSetShaderResources angeben beginnend bei Slot 0?
Wie oft sollte man das machen? Man zeichnet zum Beispiel ein Modell, welches zwei Texturen, also zwei Slots, belegt. Sollte man direkt danach die beiden Slots auf Null setzen, oder nur den zweiten Slot auf null setzen und den ersten mit der Textur überschreiben, die das nächste Modell braucht? Oder gar nicht auf Null setzen?
Werden alle Slots zurückgesetzt, wenn man einen anderen Shader bindet?

Ich mache gerade einen Test in dem ich Effects11 und direktes D3D miteinander vergleiche. Mal sehen was dabei heraus kommt.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

18.01.2014, 14:52

Effects11 kann wohl auch direkt constant buffer auswählen und updaten. Ich denke dann nimmt sich die Performance nicht mehr so viel. Das Ergebnis würde mich übrigens auch interessieren!

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

8

19.01.2014, 18:30

Ich arbeite im Moment daran, den Test zu erstellen. Das kann sich aber noch etwas hinziehen, da ich aus zeitlichen Gründen an meiner privaten Engine nicht so viel entwickeln kann.
Ich würde mich trotzdem auf Antworten zu den Fragen aus meinem Post freuen.

Ich halte euch mal auf dem Laufendem.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige