Bild zeichnen [gesucht GDI+ Fuchs]

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    Bild zeichnen [gesucht GDI+ Fuchs]

    Nabend,

    ich wollte mal fragen ob hier zufällig Jemand weiß, wie man am schnellsten ein Bild auf eine Form zeichnen kann (WinForm Projekt).
    Was ich bis jetzt mache, ist Das Bild welches in passender Größe vorliegt hiermit Graphics.DrawImageUnscaled Method (Image, Int32, Int32) zu zeichnen.
    Gibt es da noch etwas was ich machen könnte?

    Schönen Abend noch :)
    Also manchmal ... :rolleyes:
    So vergesslich kann man doch nicht sein :P
    Wie der Typ welcher per Google-Suche auf eine Antwort/Lösung von sich selbst trifft.

    Danke Artentus.
    Lässt sich GDI32 den so ohne weiteres in das Paint Event quetschen, also in verbindung mit GDI+ davor/dannach?

    @Gonger96:
    Da war ich etwas zu langsam.
    Das Forum sagt aber auch nichts mehr wenn man zu langsam ist ^^
    Ja der DoubleBuffer ist selbstverständlich an.
    Ja schon, die Frage ist nur, inwiefern dann der Kontextwechsel auf die Performance drückt. Optimalerweise solltest du nur genau einmal alles GDI32-Zeug in einem rutsch zeichnen und danach alles GDI+-Zeugs, oder halt andersrum, aber nicht immer abwechselnd. Für GDI32 musst du einiges PInvoken und einige ungemanagete Objekte erzeugen, die du auch wieder freigeben musst, und zwar bevor du wieder GDI+ benutzt, wenn du das zu oft machst wirds eher schlechter.
    Versuch ists wert, ich bin mir da selbst nicht mehr ganz sicher. Du nimmst dir ne Bitmap malst da alles drauf und gibst DC der Bitmap und des Fensters an BitBlt weiter. Das wäre klassisches Doublebuffering in C, ich hab immer mit den Rasteroptions rumgespielt ^^

    Dir könnte etwas an Speed durch P/Invoke zunichte gehen, das sollte aber nicht sichtbar sein. Ansonsten einfach mal ausprobieren obs schneller ist.

    @Artentus
    Er kann doch genauso gut erst alles mit GDI+ aufn extra Puffer rendern und den dann per GDI aufs Fenster rendern. Hätt' den selben Effekt
    Wieso ? Er hohlt sich doch nur den Device Context, der wird eh von der Klasse gemanaged.
    Ich hatte das so angedacht
    • Bitmap nehmen und Graphics Objekt draus instanzieren
    • Mit GDI+ alles Mögliche drauf rendern
    • Per BitBlt den DC auf die Form kopieren.
    Ich werde es mal gucken wie viel es bringt bzw. probieren wie gut das von der Hand geht, wenn man sich da zu sehr einen bei abbricht, ohne eine bemerkbare steigerung, bleibt die GDI Version halt so lahm.
    Dann wird das ganze sobald es fertig ist, eben in SharpDX kopiert und gut ist ;)
    @Gonger96
    Ja aber schau mal angenommen er möchte ganz viele Bilder aber auch andere Sachen Zeichnen. Die Bilder sollen mit GDI32 gezeichnet werden, der Rest mit GDI+. Um mit GDI32 auf den Puffer zeichnen zu können, braucht er den DeviceContext des Puffers, solange der aber offen ist, schlagen alle Zeichenversuche mit GDI+ mit ner AccesViolationException fehl (das hab ich schon ausprobiert), was bedeutet, dass er diesen erst wieder schließen muss. Sollen jetzt ganz oft Bilder und anderes im Wechsel gezeichnet werden, hat das zur Folge, dass er den DeviceContext immer wieder neu erstellen und dann wieder schließen muss und das ist langsamer, als wenn er alles in GDI+ zeichnen würde.

    Eistee schrieb:

    Dann wird das ganze sobald es fertig ist, eben in SharpDX kopiert und gut ist
    Solange du nicht GameUtils (<- Schleichwerbung) benutzt, ist das nicht mal eben schnell gemacht. Auch wenn Direct2D in 90% aller Dinge fast genauso wie GDI+ funktioniert, so sind es doch sehr viele Kleinigkeiten, und da kann man dann schon mal ne halbe Ewigkeit dran sitzen, bis man alles umgebaut hat.
    @Artentus: / @Gonger96: Das ist es, ich müsste beides Mischen (für die Reihenfolge).
    Denn soweit ich weiß, gibt es keinen Z-index oder ähnliches.

    Der Oberhammer ist aber, ich Depp bemerke gerade das ich vergessen habe nach einem Test die FPS von 60 auf 30 wieder runter zu schrauben. :S
    Also manchmal könnt ich mich ja selber in den hintern treten :cursing:

    Jetzt hab ich erst einmal die Bittiefe des Bildes runter geschraubt (kaum sichtbar) und wieder auf 30 mal zeichnen limitiert und es läuft wieder wie eine Eins (#1).
    Falls ich doch noch mehr Power brauchen sollte, würde ich es mal mit deinem GameUtils versuchen.
    Nur bin ich eig. absolut kein Freund (mehr) davon, weil ich hab es schon mal mit Sharpex von ThuCommix versucht, nur das (Template) bekomm ich unter VS2013 Express einfach nicht installiert.
    Und dafür wieder zu VS2010 (Ultimate) zu wechseln kommt nicht in die Tüte :P
    Ihr versteht mich glaub ich nicht ganz. Bilder sollen auch durch GDI+ gezeichnet werden. Das alles dann aber auf eine Bitmap oder sonst einen Puffer und nur der DC dieses Puffers soll per GDI32 gezeichnet werden. So wirds erheblich beschleunigt. Mit dieser Bitmap kann man dann Graphics instanzieren, schön in nem Using, da wird der DC schön verwaltet. Man hat keine Last damit
    So mach ichs auch in GameUtils (zwar aus nem anderen Grund: der Renderer stürzt sonst ständig ab, weil GDI+ nicht multithreadingfähig ist. :P ), aber optimal wäre es halt, so viel wie möglich mit GDI32 statt mit GDI+ zu zeichnen, weil das schon nen ordentlichen Performanceboost gibt, gerade DrawImage ist in GDI+ unglaublich langsam.
    Das wird großteils durch P/Invoke verloren gehen. Ein sichtbarer Unterschied gäbs auch nicht. Macht man jetzt vieles mit GDI32 wirds teils auch komplizierter und man hat zigtausend Handles mit denen man rumfrickeln muss und wieder refeasen muss. Ich denk die DC's zu kopieren sollte schon ordentlich was bringen.

    Ganz fein wärs natürlich mit DX ^^ oder notfalls Direct2D, dass ist aber n Stück langsamer und auch nur Win7 aufwärts vorhanden.
    Direct2D gibts auch schon für Vista (gut, zählt nicht, wer benutzt schon Vista "das verlorene System").
    Ja, D2D ist um einiges langsamer als D3D, aber du musst bedenken, man braucht diese Geschwindigkeit ja gar nicht, weil man zeichnet ja eh nur 2D. Ich hatte jedenfalls noch keine Probleme damit und ich glaube nicht, dass das an meinem Mörder-PC liegt.
    Ich hab letztens recht viel mit D2D gemacht. Irgendwas zum flackern bringen konnt ich nicht, FPS waren auch recht ordentlich. Schön daran ist, es zeichnet genauer und präziser als GDI. Bis auf Textrendering, dass läuft klassisch über GDI/+ oder über DirectWrite. Es gibt auch noch etliche Effeckte ála Blur, Dropshadows oder 3D-Transformationen.