Performantes Alphablending mit .NET möglich?



  • Das .NET Framework verwendet GDI+ und ist fürwahr ziemlich langsam.

    Kennt jemand einen schnelleren Weg mit .NET?

    Mit "reinem" .NET kenne ich nix. Es gibt allerdings einige C++ Libraries die recht flott diverse Bild-Manipulationen machen können.
    Je nachdem wie wichtig es für das Programm ist, könnte es sich auszahlen, sowas mittels C++/CLI einzubinden.

    Wenn du nicht DirectX verwenden willst zerfällt das Problem IMO auch in zwei verschiedene Teile:

    1. wie bekommst du die Bilder schnell alpha-geblendet und
    2. wie bekommst du die alpha-geblendeten Bilder dann schnell auf den Schirm

    Bei (1) kann dir eine Library helfen. Bei (2) ... hab' ich bisher als schnelle Variante nur Direct3D gefunden, was du ja nicht verwenden willst. Natürlich gibt's andere Möglichkeiten wie z.B. DrawDib. DrawDib war aber zumindest bei meinen Tests langsamer als über Direct3D -- wobei die für deine Anforderungen vermutlich nicht representativ sein werden (ich musste Bilder im YUY2 Format anzeigen und gleichzeitig skalieren).

    Falls du eine Möglichkeit findest das "direkt" in .NET zu machen bitte lass es mich (uns) wissen!

    p.S.: hab' grad' das da gefunden: http://cs-sdl.sourceforge.net/index.php/Main_Page
    Vielleicht is das ja brauchbar...



  • Mir scheint du zeichnest bei jedem MouseMove-Event die beiden ganzen Bitmaps inklusive Alphablending übereinander? Dafür ist GDI+ leider zu lahm (glaub mir, ich habe vor Jahren damit genügend rumgespielt ;)) - versuche, nur zu rendern, was sich auch verändert hat (z.B. könntest du einen 8x8-Pixelblock um deinen Cursor herum refreshen anstatt alles neu zu zeichnen...). Schneller zeichnen geht mit dem alten GDI+ schlicht und ergreifend nicht. Die grossen Geschütze à la Direct3D und OpenGL brauchst du trotzdem nicht unbedingt. Mit WPF sollte es auch recht einfach und flott gehen (okay, WPF ist auch recht gross und komplex 😮)

    Einen Geschwindigkeitsvorteil bekommst du eventuell auch noch mittels unsafe -Code und gelockten Bitmaps (falls du das nicht eh schon machst); da kannst du dann direkt in den Speicher schreiben. Wenn du das häufig machen musst, dann solltest du dir vielleicht schon überlegen, C++/CLI zu verwenden, denn dort bist du noch flexibler.



  • @/rant/: Ich behaupte jetzt mal einfach dass es vermutlich meist einfacher sein wird ein schnelleres "Rendering-Backend" zu verwenden, als den Code so zu optimieren, dass nur das neu gezeichnet wird was auch neu gezeichnet werden muss 😉



  • WPF ist deshalb schnell weil es Direct3D verwendet.



  • Ich vermute mal, wenn ich den bisherigen Code von jule37 seh, dass sich da noch einiges optimieren lässt. Soo langsam (wie allgemein behauptet) ist die GDI gar nicht...



  • Unix-Tom schrieb:

    WPF ist deshalb schnell weil es Direct3D verwendet.

    Richtig. Und im Gegensatz zu Direct3D kann man sich damit mehr oder weniger exklusiv auf den Entwurf einer grafikbeschleunigten GUI konzerntrieren.



  • guten morgen zusammen

    vielen dank für eure antworten.

    das problem an der sache ist - die grafik die ich bearbeite ist eine heightmap für einen 3D terrain editor. sprich ich erstelle aus ihr ein 3D mesh, dass ich im endeffekt mit direct3D zeichnen werde. allerdings ist die klasse, die in die bitmap zeichnet ein controller und den möchte ich streng von der view entkoppeln um eine saubere modultrennung zu erreichen. Außerdem ist das zeichnen der 2D daten sobald ich die 3D view implementiert habe noch nichtmal das zeichnen auf dem Bildschirm, sondern nur das manipulieren der daten.

    ich habe ursprünglich die bilddaten manuell bearbeitet (for int x=0;... for int y=0;...) was schrecklich langsam war - ist ja auch logisch bei O(n^2). in der hinsicht gab es schonmal eine performanceverbesserung durch GDI. für das neuzeichnen des rechteckes, dass sich verändert hab ich mich irgendwie zu doof angestellt, aber das werde ich wohl erst noch einmal versuchen.

    ich hatte bloß gehofft, dass es für das alphablending einen cleveren algorithmus gibt, den ich nicht kenne.

    danke für eure hilfe. ich werde mir wohl nochmal gedanken machen müssen, ob meine herangehensweise die richtige ist.



  • Du kannst ja dem GUI/Editor/Controller/... Teil sein eigenes D3D Device verpassen, dann musst du nicht den "3D-Teil" mit dem "GUI/Editor/Controller/... Teil" vermischen.



  • danke für den hinweis, aber ich fürchte das wäre nicht gut. ich möchte keine grafikbibliotheken mit den controllern und vermischen, weil man dann z.b. wenn man das model und den controller mit einer opengl view betreibt immernoch D3D im hintergrund laufen hat, was evtl. gar nicht verfügbar ist (deshalb strenges MVC). insofern war auch mein ursprünglicher ansatz mit gdi auch nicht so geschickt. ich werde nochmal meine datenstruktur überdenken und versuchen, ob ich einen guten algorithmus für das zeichnen finde.

    ich hab ja semesterferien und es ist erst mein dritter ansatz für dieses problem 😮

    versuch macht klug 😉

    danke an alle, die sich an der diskussion beteiligt haben



  • Dann pack den entsprechenden Code eben in die View
    😕
    Weiss jetzt sowieso nicht wieso der Controller Alpha-Blending betreiben sollte - sollte doch eigentlich alles was "Sache der Anzeige" ist in der View sein, oder nicht?

    p.S.: ganz egal WAS du verwendest um im Controller Alpha-Blending zu machen, die View wird nie total unabhängig sein können, denn sie muss ja dann immer das verwenden was der Controller ihr füttert. Also auch wenn du GDI+ nimmst oder das Alpha-Blending selbst implementierst. Oder steh' ich jetzt grad komplett auf dem Schlauch?



  • es geht darum: mein model ist eine bitmap, der controller manipuliert diese bitmap. diese im endeffekt nicht als bild sondern als array von höhendaten interpretiert wird. der inhalt der bitmap wird als 3D-terrain dargestellt. es fühlt sich also für den benutzer so an, als würde er direkt irgendwelche berge, hügel und täler zeichnen, malt aber eigentlich nur in der bitmap. und damit dieses terrain malen die höhe der berge usw. relativ erhöht, brauche ich alphablending.

    allerdings hat unsere bisherige diskussion mir gezeigt, dass es tatsächlich nicht ganz in ordnung war, so wie ich es angegangen bin, deshalb bin ich grad eh dabei es umzubauen und hab auch ne ganz vielversprechende idee, die ich aber erstmal austesten muss.


Anmelden zum Antworten