Allgemeine Frage zur Grafikprogrammierung



  • Hallo Leute,

    ich würde gerne eine eigene GUI(also eigenes Fenster & co.) programmieren und weiss aber nicht, womit ich das am besten machen kann.
    Die Frage ist jetzt GDI+ oder Direct2D? Ich habe mir GDI+ angeschaut und bin mehr oder weniger auch damit zurecht gekommen, jedoch
    habe ich noch keine Ahnung, wie ich mit GDI+ ein eigenes Fenster mache.

    Direct2D scheint besser dafür geeignet zu sein. Soweit ich das verstanden habe nutzt GDI+ die CPU und Direct2D die GPU, was für mehr
    Geschwindigkeit/Performanc sorgt.

    Würde mich über Hilfe/Erfahrungen freuen, danke!



  • Hängt von deiner Erfahrung ab. Ich würde Direct3D oder Direct2D empfehlen, wobei ich nicht sicher sagen kann, wie es bei Direct2D mit der Performance aussieht, sobald du größere GUIs hast. Ich denk, mit Windows 8.1. wurden da einige Dinge verbessert, verwend aber selbst kein D2D...



  • Ist nicht die übliche Variante Direct3D zum Rendern zu verwenden, und Direct2D nur für Dinge wie Text?



  • hustbaer schrieb:

    Ist nicht die übliche Variante Direct3D zum Rendern zu verwenden, und Direct2D nur für Dinge wie Text?

    Ich würde mal sagen: Das hängt davon ab was man macht. Bis vor kurzem zumindest war Direct2D/Direct3D interop relativ anstregend, da D2D intern noch das alte D3D10 verwendete und man seinen ganzen Kram daher durch vier verschiedene APIs (D2D -> D3D10 -> DXGI -> D3D11) schleifen musste. Ich persönlich verwend meinen eigenen, auf DirectWrite basierten, Textrenderer in D3D. Ich glaube mit Windows 8(.1) wurde da was besser (ab irgendeinem Punkt verwendet D2D nun wohl D3D11). Wenn es nur um 2D Rendering geht und die Performance von D2D für die jeweilige Anwendung ausreichend ist, dann ist D2D auf jeden Fall einfacher. Die Variante von wegen D2D nur für Textrendering verwenden ist imo höchstens für Anwendungen wie z.B. Spiele interessant...



  • Kann dir da nur QT + QtCreator (ganz gute IDE auch unabhängig von QT) ans Herz legen!



  • Direct2D ist schon recht flott, auf jeden Fall aber deutlich flotter als GDI(+).

    Aber Du musst dabei ein paar Punkte beachten:

    1. D2D arbeitet nicht mit Pixeln, sondern mit DIPS. Das hat den Vorteil das Du "DPI-Aware" bist, also auch eine gute Auflösung auf High-DPI Devices (Stichwort: Retina) hast. Das kann aber am Anfang ziemlich verwirrend sein, wenn Du eine simple Linie auf 0.5er Float-Koordinaten setzen musst, statt wie gewohnt auf "geraden" Pixeln.

    2. Du solltest Ressourcen wie Brushes wiederverwenden und nicht ständig neu erzeugen (dabei hilft Dir z.B. eine Ressourcen-Factory-Klasse).

    3. Du MUSST alle Ressourcen neu erzeugen wenn der User Dein Fenster auf seinen zweiten Monitor schiebt oder einfach nur STRG+ALT+ENTF drückt. Dies kannst Du im RenderTarget->EndDraw HRESULT abfangen.

    4. Obwohl D2D eine gute Performance hat solltest Du nur das neu zeichnen was auch neu gezeichnet werden muss. Stichwort: "Retained Mode" bei der Erstellung des HwndRenderTargets.

    5. DirectWrite Texte mit TextLayout cachen, sonst ist die Textausgabe nicht gerade performant.

    Wenn Du diese Punkte beachtest bekommst Du mit D2D eine super Performance. Aber es ist natürlich auch etwas Fleißarbeit notwendig. Aber mit den Ressourcen "quasen" kannste mit D2D leider nicht. Dann wäre evtl. Direct 3D besser für Dein Vorhaben, da Du dann alles ständig neu zeichnen könntest, aber Dir wirklich jeden Kram selbst schreiben müsstest.

    Grüße
    Bojana


Anmelden zum Antworten