Ter n i m al (beachten Sie die Schreibweise) ist ein Programm, das eine animierte Lebensform im Terminal unter Verwendung von Unicode -Blocksymbolen zeichnet. Es arbeitet in den meisten terminalen Emulatoren und mit den meisten monospatierten Schriftarten.

Aus praktischer Sicht ist das Programm nicht sehr nützlich. Es enthält jedoch einiges an cooler Technologie und Mathematik:
Ternimal ist auch eine Übung in Minimalismus und Zurückhaltung. In nur 1000 Rostzeilen geschrieben, hat es keine Abhängigkeiten und verbraucht nur sehr wenige Ressourcen: 400 KB auf Festplatte, 3 MB RAM und 4 % eines einzelnen CPU -Kerns mit den Standardparametern. Es implementiert seine eigenen linearen Algebra -Operationen von Grund auf sowie eine grundlegende Befehlszeilenanalyse und einen einfachen Zufallszahlengenerator.
Ternimal hat keine Abhängigkeiten von der Rust Standard Library und benötigt keine Fracht für den Bau. Nur rustc (> = 1,20) muss installiert werden. An diesem Punkt kann ternimal erstellt werden mit:
git clone https://github.com/p-e-w/ternimal.git
cd ternimal
rustc -O ternimal.rs
Grundsätzlich tut Ternimal nichts anderes als das Abstandsfeld von einem Segment eines mäandrierenden Pfades. Es gibt viele Parameter, die diesen Prozess steuern, aber fast alle können über die Befehlszeile manipuliert werden.
Dies macht das System sehr flexibel. Das Folgende sind nur einige Beispiele für das, was möglich ist:
./ternimal length=100 thickness=1,4,1,0,0 radius=6,12 gradient=0:#666600,0.5:#00ff00,1:#003300

Sinuswellen können verwendet werden, um ziemlich organisch aussehende Formen zu erzeugen. In diesem Fall bildet eine einzelne Halbwelle den Körper einer Schlange.
./ternimal length=200 thickness=0,4,19,0,0

Ternimal macht nur ein einzelnes Modell. Dickenschwankungen können jedoch das Erscheinungsbild mehrerer getrennter Entitäten auf koordinierte Weise verleihen.
./ternimal length=20 thickness=70,15,0,1,0 padding=10 radius=5 gradient=0.03:#ffff00,0.15:#0000ff,0.3:#ff0000,0.5:#00ff00

Die Dickefunktion enthält einen Zeitparameter. Dies ermöglicht es, Formanimationen zu definieren. Willkürlich viele Fourier -Serienbegriffe können angegeben werden, was sehr komplexe Animationen ermöglicht.
Ternimal ist für die Leistung stark optimiert, soweit es in vielen Situationen die CPU -Zeit für die Erzielung seiner Ausgabe ist, geringer als der vom Terminalemulator genommen, um dasselbe anzuzeigen. Es werden verschiedene Tricks verwendet, um die Rechenlast und die Ausgangsgröße zu minimieren. In GNOME -Terminal rendern die Standardparameter bis zu 2500 Bilder pro Sekunde.
Ich habe alles unter der Sonne ausprobiert, um mit gemischten Ergebnissen noch mehr Leistung herauszuholen. Zu den erfolglosen/halb erfolgreichen Versuchen gehören:
f32 anstelle von f64 . Dies ergibt eine Beschleunigung von 5 bis 10 %, ist jedoch nach einigen Tagen Präzisionsprobleme. Es könnte möglich sein, die Zeit- und Positionswerte in regelmäßigen Intervallen zurückzusetzen, um dies zu vermeiden, aber die Logik wäre ziemlich komplex.stdout -Verriegelung und/oder Pufferung. Obwohl Ternimal eine große Ausgabemenge schreibt, ergibt sich diese Optimierung nur in einer enttäuschenden Geschwindigkeit von 1 % und wurde daher aufgegeben.format! Makro ist für diesen Zweck schwer zu schlagen, und jede Alternative, die ich ausprobierte, war entweder gleich oder langsamer.target-cpu=native . Dies ergab auch keine messbare Verbesserung.Das Profilieren mit Callgrind und Oprofile zeigt, dass der größte Teil der CPU -Zeit damit verbracht wird, die Ausgangszeichenfolge zu konstruieren und zu schreiben und dass das Rendern von Berechnungen nur eine Rolle für sehr große Modelle spielen. Angesichts des Mangels an Erfolg scheint es vernünftig zu sein, dass die Leistung von Ternimal bereits sehr zufriedenstellend ist.
Ternimal wurde an Linux, MacOS und Windows getestet.
Unter Linux machen fast alle terminalen Emulatoren ternimale makellose. Auf macOS werden ITM2 oder Alacritty empfohlen. Unter Windows scheinen PowerShell und WSL gut zu funktionieren, wobei Conemu auch nicht mit 24-Bit-Farben funktioniert.
Höchstwahrscheinlich, weil Ihr Terminal keine 24-Bit-RGB-Farbfluchtsequenzen unterstützt. Dies wiederum bedeutet wahrscheinlich, dass Sie das Standardterminal von MacOS verwenden.
Sie haben zwei Optionen:
true_color=false , um auf eine 256-Farben-Palette zurückzukehren, die von praktisch jedem Terminalemulator unterstützt wird (sieht aber nicht so gut aus).Entweder, weil die Blockzeichen Ihrer Schriftart die Zeichenzelle nicht vollständig füllen oder weil Ihr Terminal einen Zeilenabstand mehr als Null hat.
Ternimal funktioniert am besten mit Schriftarten, die ein Charakter -Seitenverhältnis so nahe wie möglich auf 2: 1 haben. Die Schriftart in den Screencasts ist die wundervolle Iosevka.
Die Linux -Konsole unterstützt Unicode -Schriftarten nicht. Es scheint jedoch die Unicode -Codierung zu erkennen und versucht, bestimmte Unicode -Codepunkte in der internen Codierung auf Codepunkte zu übersetzen, einschließlich der von Ternimal erforderlichen Blocksymbole.
Es scheint jedoch einen Fehler in dieser Konvertierung zu geben. Der Blockcharakter der oberen Halbzeit wird korrekt übersetzt, aber der untere halbe Block ist nicht, was zu einem gestreiften Muster führt.
So was:

Mitwirkende sind immer willkommen. Bitte stellen Sie jedoch ein Problem ein, in dem Sie beschreiben, was Sie hinzufügen möchten, bevor Sie eine Pull -Anfrage öffnen, insbesondere für neue Funktionen! Ich habe eine klare Vorstellung von dem, was ich tun möchte (und nicht möchte), sodass das Diskussion potenzieller Ergänzungen Ihnen helfen kann, Doppelarbeit und verschwendete Arbeit zu vermeiden.
Durch den Beitrag erklären Sie sich damit einverstanden, Ihre Änderungen unter derselben Lizenz wie der Rest des Projekts zu veröffentlichen (siehe unten).
Copyright © 2017 Philipp Emanuel Weidmann ([email protected])
Veröffentlicht unter den Bedingungen der GNU General Public Lizenz, Version 3