The MATRIX build 2018-10-16

  • Ich hatte wieder mal bock was in GDI / GDI+ zu coden. Als Inspiration diente The Matrix Code Rain.

    MatrixCodeRain.png

    Download von The Matrix.au3 / The Matrix fullscreen.au3 siehe weiter unten. Source Code ist leider zu lang geworden, um ihn hier direkt zu posten (max. 20.000 Zeichen).

    Bitte melden, wenn jemand die MATRIX entschlüsselt hat. ;)

    Bis denne...

  • Sehr schön umgesetzt UEZ.

    Das erinnerte mich gleich an alte Zeiten.

    Wer möchte, kann den von mir abgebildeten Command-Code in eine Textdatei einfügen und als "Dateiname.cmd" abspeichern.

    Das Ergebnis ist aber lange nicht so schön umgesetzt als das von UEZ und kommt auch nicht annähernd an das Original heran.

    Dennoch ist es sehenswert, finde ich. Vor allem die Geschwindigkeit konnte mich beeindrucken :)

  • Ja gut bazii , es ist schnell. Aber dieses Skript gibt überhaupt keine Informationen aus der Matrix wieder. Wenn ich wissen will was die Frau in Rot gerade macht, lässt mich dein Skript leider im Stich. :(

    Grüße autoiter

  • Einfach schön....

    Aber ich werde nie ein Fan von GDI+, denn alleine die beiden Zeilen

    Code
    DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas2, "handle", $hBrush_Bg, "float", 0, "float", 0, "float", $iW, "float", $iH)
    DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush_Clr, "float", 0, "float", 0, "float", $iW, "float", $iH)

    "kosten" so viel, wie der gesamte andere Code im Loop zusammen:Face:

    Irgendwann in grauer Vorzeit hatte ich mal übers Blitten dieses Abdunkeln hinbekommen, das war dann echt fix. Ich werde mal suchen....:Glaskugel:

  • was der Befehl mode 1000 bewirken soll

    nun, damit erhalte ich das beste Ergebnis. Wenn ich den "mode" Befehl weglasse, bekomme ich ein kleines zentriertes cmd-Fenster. Bei "mode 100" erhalte ich ein langes und schmales Fenster.

    Ab "mode 200" ist das Fenster groß aber wird nicht flächendeckend mit Zahlen aufgefüllt. Der kleinste Wert liegt bei 14,iregendwas und der höchste Wert bei 1000, wobei bei den damaligen Röhrenbildschirmen die komplette Fläche abgedeckt wurde. Auf den heutigen Bildschirmen haut das wohl nicht mehr so gut hin. Wegen der unstimmigen Syntax gebe ich Dir gundsätzlich vollkommen recht aber bei einem Test zeigt sich meine Einfachvariante durchaus funktional.

    Aber dieses Skript gibt überhaupt keine Informationen aus der Matrix wieder. Wenn ich wissen will was die Frau in Rot gerade macht, lässt mich dein Skript leider im Stich.

    :) Es soll ja auch nur grüne Zahlen auf schwarzem Hintergrund in zufälliger Reihenfolge in rasender Geschwindigkeit, sowie ein Hilfsmittel für Epilepsiebedürftige sein.

    Die Frau in Rot waren übrigens viele identische Zwillinge und sollten aus der eigenen, lebhaften Fantasie ragen und nicht aus dem minimalistischen Batchcode :saint:<3.

    Wenn wir schon dabei sind. Ich stehe im übrigen viel mehr auf die im Film viel hübschere, schwarzhaarige, kanckhintrige und sehr schlagkräftige Dame (Trinity) mit Sonnenbrille und enger Lederlatexhose, welche den Schlüsselmeister auf dem Sozius hinter sich mitführte 8o (ich hoffe das verstöst nicht gegen die Forenregeln). Übrigens: Ich hatte mir sogar wegen des Filmes damals Anfang der 2000er ein Nokia 8110 für damals extrem teure 600 DM (trotz Debitelvertrag) gekauft. Leider habe ich es damals nach dem Kauf eines Nokia Communikators in den Müll geworfen. ||

    Fundstelle:

    Hier ist übrigens auch schon ein interessantes Matrix-Ergebnis von o2candoo gepostet worden. Der Anhang funktioniert ohne Änderungen im Vollbildmodus hervorragend.

    Matrix_Eigen.au3

  • Einfach schön....

    Aber ich werde nie ein Fan von GDI+, denn alleine die beiden Zeilen

    Code
    DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas2, "handle", $hBrush_Bg, "float", 0, "float", 0, "float", $iW, "float", $iH)
    DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush_Clr, "float", 0, "float", 0, "float", $iW, "float", $iH)

    "kosten" so viel, wie der gesamte andere Code im Loop zusammen:Face:

    Irgendwann in grauer Vorzeit hatte ich mal übers Blitten dieses Abdunkeln hinbekommen, das war dann echt fix. Ich werde mal suchen....:Glaskugel:

    Hmmm, ich habe auch gesucht, aber nichts in meiner Sammlung gefunden. Also habe ich Google gefragt und letztendlich die GDI Funktion "AlphaBlend" gefunden.

    AutoIt
    DllCall("Msimg32.dll", "bool", "AlphaBlend", "handle", _
                                    $hDC_backbuffer, "int", 0, "int", 0, "int", $iW, "int", $iH, _
                                    "handle", $hDC_backbuffer3, "int", 0, "int", 0, "int", $iW, "int", $iH, _
                                    "long", 0x10000 * 0x18)

    Leider ist sie nicht viel schneller als

    AutoIt
    DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush_Clr, "float", 0, "float", 0, "float", $iW, "float", $iH)

    Beide laufen so ca. in 4-7 ms.

    Das Blitten der 32-bit GDI Bitmap erstellt mit _WinAPI_CreateDIBSection() funzt leider nicht richtig oder ich bin zu blöd (vermutlich das letztere).

    Bin mal gespannt, ob du was findest...:)

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Nettes Programm UEZ da bekommt ma echt wieder lust auf die Filme.

    Das einzige was mir aufgefallen ist, ist dass die FPS Anzeige nicht ganz stimmen kann. Wenn ma die Werte entsprechend anpasst, Fullscreen und auch entsprechend die Geschwindigkeit hoch schraubt, penndelt es sich bei 18FPS ein, das ganze ist aber definitiv komplett flüssig dargestellt.

  • Nettes Programm UEZ da bekommt ma echt wieder lust auf die Filme.

    Das einzige was mir aufgefallen ist, ist dass die FPS Anzeige nicht ganz stimmen kann. Wenn ma die Werte entsprechend anpasst, Fullscreen und auch entsprechend die Geschwindigkeit hoch schraubt, penndelt es sich bei 18FPS ein, das ganze ist aber definitiv komplett flüssig dargestellt.

    Wenn ich 1:1 Fullscreen schalte oder den Wert der Variable $iAmountChars stark erhöhe, dann gehen die FPS drastisch nach unten. Ich weiß nicht, welche Werte du angepasst hast.

    Ich habe nun auch eine Fullscreen Variante hinzugefügt (siehe Beitrag #1), aber gezeichnet wird nur auf der Hälfte der Desktop Größe, dann aber zu Fullscreen hoch skaliert. Ansonsten sieht's übel mit den FPS aus.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Angepasst hab ich folgende Werte:

    $iW = @DesktopWidth, $iH = @DesktopHeight

    $fFontSize = 15

    $iAmountChars = 70

    $iMaxSpeed = 24

    $iMinSpeed = 8

    Kann Sie aber auch $iAmountChars noch mehr erhöhen und die FPS geht nicht runter. Das ganze wirkt auch noch flüssig und ohne irgendwelche Verzögerungen.

    Erst wenn ich $iAmountChars auf 180 setz, merk ich eine deutliche Verlangsamung beim ausführen.

    Die Fullscreen Variante gefällt mir jetzt selber weniger, einzelne Pixel fallen dabei doch sehr stark leider auf.

  • Hallo mep

    Erst wenn ich $iAmountChars auf 180 setz, merk ich eine deutliche Verlangsamung beim ausführen.

    Man kann das leider nur schwer übertragen, da die Ergebnisse je nach Prozessor stark variieren. An einem PC kann das gerne mal doppelt so schnell sein, wie am Laptop..

    Grüße autoiter

  • autoiter Hab ich grad auf dem Rechner von der Arbeit gemerkt. Auch wenn er noch nicht wirklich alt ist merk ich schon ein deutlichen Unterschied bei der Performence.

    Muss dazu sagen das ich mich bisher noch nicht mit GDI/GDI+ beschäftigt hab, und nicht gedacht hab das es von der Performence her so deutlich zu spüren ist.

  • Der Performance Killer ist die For/Next Schleife in der Hauptschleife, insbesondere die _GDIPlus_GraphicsDrawStringEx() Funktion.

    Also, warum nicht die ganzen Zeichen vorher in ein Bitmap Array zeichnen und in der For/Next Schleife nur die Bitmaps in die GUI kopieren?

    Gedacht getan -> Steigerung von ca. 23 FPS auf ca. 35 FPS.

    Post#1 aktualisiert.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • 60FPS im Fullscreen, damit kann (muss) man leben! :o)

    Und der "Neo" toppt natürlich alles!