_GDIPlus_BitmapApplyFilter v0.9.6 build 2017-05-14 beta

  • Da AutoIt für Bild Effekte / Bildbearbeitung zu langsam ist, wenn die Funktion nicht in der GDIPlus DLL vorhanden sind, habe ich eine DLL mit FreeBasic programmiert, die diese Lücke schließen soll. Natürlich ist Raum für Optimierungen vorhanden!

    Folgende Filter sind implementiert:

    Beispiele zu den einzelnen Funktionen kann man in der Zip Dateie finden.

    Download und Screenshots hier: https://www.autoitscript.com/forum/files/fi…ilter-udf-beta/


    Die Filter in ASM zu implementieren wäre sicherlich eine Herausforderung, aber dann würden mir mit hoher Wahrscheinlichkeit die letzten Haare ausfallen... :D


    Viel Spaß beim Ausprobieren.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • , aber dann würden mir mit hoher Wahrscheinlichkeit die letzten Haare ausfallen...

    ....und dann würdest du so aussehen wie ich :D

    Sehr sehr feines Script, wie immer :thumbup: . Und ENDLICH hat es mal jemand geschafft, eine Compilersprache mit Nähe zu AutoIt einzubinden. :klatschen:
    Da kann ich mich ja (endlich?!) mit ASM zur Ruhe setzen...NIX DA, der FreeBasic-Compiler schreibt wirklich guten Code, aber gerade im Bereich SIMD/SSE geht da doch noch einiges :saint: . Und da ASM glücklicherweise zu inlinen ist, sind (potenziellen) Optimierungen Tür und Tor geöffnet...schaumamal...

  • ....und dann würdest du so aussehen wie ich

    Da fehlt nicht mehr viel. :rofl:


    Wie gesagt, da ist noch genug Raum für (ASM) Optimierungen.

    Da müsste ich erst mal die MMX / SSE Befehle richtig verstehen, damit überhaupt eine Boost erreicht werden kann. Ich glaube nicht, dass mit den Standard ASM Befehlen ich überhaupt was rausholen kann.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich glaube nicht, dass mit den Standard ASM Befehlen ich überhaupt was rausholen kann.

    "was rausholen" ist das Stichwort...
    Mal angenommen, die Berechnungen für einen Filter dauern 300 Millisekunden. Dann hat der Programmierer ggf. noch einige Compilerflags gesetzt, und das sind die einzigen Stellschrauben, an denen er drehen kann, wenn (und ja, WENN(!) ) der Algorithmus ausoptimiert ist!
    Schaut man sich dann an, was der Compiler gemacht hat, wird man feststellen, daß bspw. für "Standardfunktionen" wie Sinus/Cosinus/Wurzelziehen/uswusf. ein API-Call bzw. ein Call der "eigenen" Bibliotheken erfolgt. Dort wiederum wird u.a. sämtliches Errormanagement betrieben, was sich die Bibliothekenbauer in den letzten 30 Jahren nur vorstellen konnten, um ALLE vorstellbaren Fehler des Programmierers abzufangen und auszuwerten und anzuzeigen, damit um Himmels Willen nur kein Absturz bei irgendeinem Programm erfolgt. Das ist idR auch gut so, da meiner Erfahrung nach Programmierer sich sehr gerne darauf verlassen, dass sie absolut keine Fehler machen... ;)
    Weiterhin angenommen, der Programmierer weiß was er da tut, kann er dann, statt die "superduper-absolut-Hochsicherheits-volldeppensichere-Sinus-Bibliotheksfunktion", welche "nur" 550 Prozessortakte benötigt, auf die vom Prozessor zur Verfügung gestellte Sinusfunktion zurückgreifen, welche diese Berechnung in meinetwegen 50 Takten abwickelt.
    Bei einem Full-HD-Bild mit ca. 2e6 Pixeln macht das bei 550 Takten/Sinusberechnung über den Daumen 1e9 Takte, bei 2Ghz Prozessortakt dauern alle Berechnungen somit ca. eine halbe Sekunde!
    Zwingt man nun, üblicherweise durch "inlinen" von Assemblercode, den Compiler zum Verwenden des fsin-Befehls der FPU, reduziert sich nur dadurch die Laufzeit des Filters um einiges....

    Das alles kann man aber nur dann "optimieren" wenn man sieht und versteht, was der Compiler macht. Einige Compiler sind richtig gut, andere eher nicht. Heutzutage würde ich mich bei "Standard-Berechnungen" nicht mehr mit einem Compiler anlegen wollen, allerdings gibt es imho nur extrem wenige Compiler, welche bspw. die seit Jahrzehnten verwendbaren SIMD/SSE-Befehle auch umsetzen....und da ist dann auch mal der Faktor 3-4 an Laufzeiteinsparung drin, wenn man diese "richtig" einsetzt.
    Wer als Hobbyprogrammierer sich dieses "Handoptimieren" antuen will, ist ja eine ganz andere Frage :theke:
    Eukalyptus hat da ja schon einiges vorgelegt :rock:

  • Als nächsten Schritt werde ich versuchen die Funktionen erst mal per Threading zu beschleunigen. Mal sehen, ob's klappt und was am Ende rausspringen wird.

    Andy: danke für dein Feedback. :thumbup:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯