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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

15.08.2013, 00:48

Ich persönlich verwende im Moment auch in etwa so ein System, habe aber ernste Zweifel an der Sinnhaftigkeit des Ganzen. Ich hab's nicht ausprobiert, aber ich würde vermuten, dass die simple Variante mit einfach per CPU die fertigen Vertices in einen Buffer packen und rendern (ganz ohne Geometry Shader und sonstigen Glamour) immer noch am schnellsten ist. Auf jeden Fall würd ich keinen Constant Buffer verwenden, sondern einen ganz normalen Buffer oder zumindest einen Texture Buffer. Constant Buffer sind auf Broadcastzugriff ausgelegt, kreuz und quer drin rumlesen ist wohl mit Abstand das Schlechteste, was man mit einem Constant Buffer machen kann (Constant Memory ist sehr schnell, so lange parallel an der selben Adresse gelesen wird – ideal für Shader Uniforms – die Performance nimmt dafür aber linear mit der Anzahl der parallelen Zugriffe auf unterschiedliche Adressen ab, da diese serialisiert werden müssen). Der Input Assembler dagegen, wäre z.B. genau für sowas gebaut...

Ich hab eine Textur, die als Glyphen Cache dient und einen Buffer, der Glyphen Indizes auf Texcoords, Größen etc. mapped. Als Input verwend ich einen dynamischen Vertex Buffer, der einfach nur Glyphen Index und Ziel Position enthält. Die rendere ich als Punktliste mit einem Geometry Shader, der dann basierend auf Glyphen Index und Position mit den Infos aus der Glyphen Map ein Quad generiert. Ich hab allerdings nie wirklich die Performance analysiert; wenn dir fad ist und du das mal Benchmarken willst: Deine Ergebnisse würden mich auch interessieren...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (15.08.2013, 01:09)


12

15.08.2013, 05:42

Ich hab noch einen Constant-Buffer der in etwa so aussieht (hier vereinfacht):

C-/C++-Quelltext

1
2
3
4
cbuffer BufferText : register(b1)
{
    uint Text[1024];
};

Da steht der Text drin. Ein Character braucht normaler Weise nur ein "unsigned char", also werden hier 4 Character pro Eintrag im Array gespeichert.
Damit kann der Text maximal 4192 Zeichen lang sein (reicht für eine Zeile Text).
Aber woher weißt du jetzt, an welcher Position auf dem Bildschirm du den Buchstaben zeichnen musst? Schließlich kann jeder Buchstabe unterschiedlich breit sein oder hinter beliebig vielen Zeilenumbrüchen liegen … ich hatte jetzt so verstanden, dass du deshalb einen zweiten Constant Buffer anlegst, wo die fertig berechneten Positionen der Buchstaben-Quads auf Bildschirm und Textur drin sind. Aber wenn das so ist, ist einer der beiden Puffer überflüssig (sogar alle drei, würde ich sagen), denn kannst du die Textzeichen ja gleich mitspeichern, zumal der Input Assembler des Vertex Shaders 8-Bit-Integer unterstützt (und dir damit das Entpacken abnimmt).

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

15.08.2013, 06:43

Ich denke hier wie dot. Es mag technisch prima gehen, aber solange nicht gerade hunderttausende Zeichen gerendert werden sollen, dürfte das Bind für den Shader am Ende mehr Zeit verbraten als einmal auf der CPU die Vertices für den Text festzulegen und diese dann zu rendern. Text-Änderungen entstehen auch selten jeden Frame, die Daten sind also oft für viele Frames konstant und bedürfen gar keines Updates.
Die Sinnhaftigkeit des ganzen Unterfangens ist also höchst fragwürdig.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

14

15.08.2013, 17:32

Die Sinnhaftigkeit des ganzen Unterfangens ist also höchst fragwürdig.

Ich will erst mal nur rausfinden, was schneller ist, wenn ich eben jede Menge Text rendern will.
Ob man das wirklich braucht und in den meisten Situationen die bisherige Variante ausreicht, kann man sich dann immer noch überlegen.

Aber Optimierung macht mir halt einfach Spaß ^^
Die Sinnhaftigkeit ist mir da erst mal nebensächlich.

wenn dir fad ist und du das mal Benchmarken willst: Deine Ergebnisse würden mich auch interessieren...

Klar, sobald ich Ergebnisse habe poste ich die hier. Kann aber noch ein paar Tage dauern. Vielleicht hab ich das innerhalb der nächsten Woche fertig.

Und das mit dem parallelen Zugriff auf Constant-Buffer stimmt natürlich. Ich würde dann also besser einen "StructuredBuffer" verwenden.

Gruß,
Lukas

Werbeanzeige