• Moin,

    Ich möchte euch hier das vorstellen, was über einige Wochen und Monate nebenher entstanden ist. Die ImageUDF.

    Wie der Name schon sagt geht es um Bilder (Nicht um Linien, Kreise oder Vektoren).
    Das Augenmerk liegt auf der Ausführgeschwindigkeit(beim Zeichnen) und der einfachen Anwendung der Funktionen.
    (Im Gegensatz zu purer GDI+ Anwendung, wo die Geschwindigkeit beim Zeichnen (von Bildern) oft auf der Strecke bleibt)

    Es wird z.B. um ein einfarbiges Viereck zu füllen keine Brush oder sonstiges benötigt die wieder handles hat und Variablen braucht, sondern nur die Farbe.

    Um Bilder zu erzeugen wird eine Hand voll Funktionen geliefert, sodass man leere Bilder erzeugen kann, Bilder aus Ressourcen laden kann oder von Dateien.

    Zum Zeichnen werden die WinAPI-Funktionen genutzt. Daher kommt auch die relativ hohe Geschwindigkeit.

    Ein $Image besteht aus mehreren Komponenten, damit man z.B. die Breite nicht erst über einen DllCall(das kostet Zeit) ermitteln muss. Enthalten sind:
    1. hDC
    2. Breite
    3. Höhe
    4. Ptr (für die Bitmapdaten im Ram)
    5. HBMP
    Diese werden in einer Struct gesichert, was auch die Arraylagerung ermöglicht. ( ein Array für alle Bilder die in einem Programm genutzt werden. Anschließend kann man einfach eine Schleife durchlaufen lassen um alle zu löschen. )

    Die ImageUDF ist somit ein Wrapper für GDI(+) und WinAPI Funktionen die somit leichter zu Verwenden sein sollen.

    Noch ist die UDF erst der "kleine Anfang" von etwas Größerem.
    Noch geplant ist Assemblernutzung und Prozedurale Grafikerzeugung. (evtl auch OpenCL nutzung)

    Zum Zeichnen ist zu sagen:

    Funktionen mit einem "Draw" ignorieren die Transparenz, jene mit einem "Blend" erhalten sie. (Wer also Etwas mit transparenten Teilen Zeichnen will sollte immer die Blend Funktionen nutzen)

    Wer tatsächlich alle Parameter vom BitBlt / AlphaBlend ausnutzen will sollte die Funktion direkt aufrufen und nicht über die Wrapperfunktoinen. Diese sollen das "einfache" verwenden vereinfachen. _Image_Draw hat z.B. nur 4 Parameter, DC, X, Y, Img. Damit muss man nicht immer alle 8 oder mehr Parameter ausfüllen und erhält wesentlich mehr übersichtlichkeit im Code.

    Alle "Draw" Funktionen haben ein "Blend" Gegenstück. Sollte man nachträglich etwas Transparentes nutzen reicht die Änderung eines Wortes um alles umzustellen.

    Ich hoffe alles so kommentiert zu haben, wie es sich gehört und hoffe, dass ihr damit etwas anfangen könnt.
    Anbei ist auch eine kleine Demonstration. (Klar kann man das alles auch per GDI+ machen...)

    Für Verbesserungen und Vorschläge bin ich offen :P

    lg
    Mars(i)

  • Gefällt mir! Klasse Arbeit!

    Hast du einen Vergleichsbenchmark, wo man den Unterschied messen kann? Z.B. das Beispiel als pur GDI+.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Beim Zeichnen der Vierecke scheitert die ImageUDF leider kläglich. (Es ist zwar möglich, dauert aber länger als ein gleich großes Bild zu zeichnen^^)

    (Angaben in ms)
    ;Alles ; 1x Clear, 2xViereck, 3xBild (Bilder: 1x Großes Logo, 1x Kleines Logo, 1x Backbuffer auf Backbuffer2)
    ;2.45 - ImageUDF ; 3x Viereck, da der Clear in Asm sein wird und noch nicht eingebaut ist.
    ;2.35 - GDI+

    ;Bilder+Clear ; 1xClear, 3xBild (Bilder: 1x Großes Logo, 1x Kleines Logo, 1x Backbuffer auf Backbuffer2)
    ;1.45 - ImageUDF
    ;1.75 - GDI+

    ;Bilder ; 3xBild (Bilder: 1x Großes Logo, 1x Kleines Logo, 1x Backbuffer auf Backbuffer2)
    ;0.49 - ImageUDF
    ;1.20 - GDI+

    ;Bilder ; 3xBild (Bilder: 1x Großes Logo (skaliert auf 160x160), 1x Kleines Logo(auf 40x40), 1x Backbuffer auf Backbuffer2)
    ;0.58 - ImageUDF
    ;1.55 - GDI+

    Wenn es nur um Bilder geht ist die ImageUDF mehr als doppelt so schnell.
    Sachen wie Clear oder Rechtecke füllen werden später als Inlineasm eingebaut. Dann geht auch das schneller als GDI+

    Edit: Wenn man als Clear ein BitBlt mit Blackness nutzt (dann geht halt nur schwarz/transparent, aber keine Farbigen clears) kommt man beim. 1xClear, 3xBild auf 0.67ms.. Allein der Funktionsaufruf um das DC zu bkeommen dauert etwa 0.07ms. Speichert man das DC in einer Variable ab kommt man auf ca. 0.6ms.

    lg
    Mars(i)