Ter n i m al (철자에 참고)은 유니 코드 블록 기호를 사용하여 터미널에서 애니메이션 생명체를 그리는 프로그램입니다. 대부분의 터미널 에뮬레이터와 대부분의 단일 장애가있는 글꼴에서 작동합니다.

실제적인 관점에서 볼 때이 프로그램은 그다지 유용하지 않습니다. 그러나 그것은 상당히 멋진 기술과 수학을 포함합니다.
3 차는 또한 미니멀리즘과 구속의 운동입니다. 1000 줄의 녹으로 작성된이 제품은 의존성이 없으며 디스크의 400KB, 3MB RAM 및 기본 매개 변수를 갖춘 단일 CPU 코어의 4 %를 소비합니다. 기본 명령 줄 파싱 및 간단한 임의의 숫자 생성기뿐만 아니라 자체 선형 대수 작업을 처음부터 구현합니다.
Ternimal은 Rust Standard Library와는 별도로 의존성이 없으며 건물을위한화물이 필요하지 않습니다. rustc (> = 1.20) 만 설치해야하며,이 시점에서 3 배를 구축 할 수 있습니다.
git clone https://github.com/p-e-w/ternimal.git
cd ternimal
rustc -O ternimal.rs
기본적으로, 3 배는 구불 구불 한 경로의 세그먼트에서 거리 필드를 색칠하는 것 이상을 수행하지 않습니다. 이 프로세스를 제어하는 많은 매개 변수가 있지만 거의 모든 매개 변수가 명령 줄을 통해 조작 할 수 있습니다.
이것은 시스템을 매우 유연하게 만듭니다. 다음은 가능한 것의 몇 가지 예입니다.
./ternimal length=100 thickness=1,4,1,0,0 radius=6,12 gradient=0:#666600,0.5:#00ff00,1:#003300

사인파는 매우 유기적 인 모양을 생성하는 데 사용될 수 있습니다. 이 경우, 단 하나의 반파가 뱀의 몸을 형성합니다.
./ternimal length=200 thickness=0,4,19,0,0

3 배는 단일 모델 만 렌더링합니다. 그러나 두께 변화는 조정 된 방식으로 움직이는 다중 연결이 끊어진 엔티티의 모양을 줄 수 있습니다.
./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

두께 기능에는 시간 매개 변수가 포함됩니다. 따라서 모양 애니메이션을 정의 할 수 있습니다. 자의적으로 많은 푸리에 시리즈 용어를 지정하여 매우 복잡한 애니메이션을 가능하게합니다.
3 배는 많은 상황에서 출력을 생성하는 데 필요한 CPU 시간이 터미널 에뮬레이터가 동일하게 표시하는 데 걸리는 것보다 적은 성능에 대해 최적화됩니다. 계산 부하 및 출력 크기를 최소화하기 위해 다양한 트릭이 사용됩니다. 그놈 터미널에서 기본 매개 변수는 초당 최대 2500 프레임을 렌더링합니다.
나는 혼합 된 결과와 함께 더 많은 성능을 짜기 위해 태양 아래의 모든 것을 시도했습니다. 실패/반 감소한 시도 중 일부는 다음과 같습니다.
f64 대신 f32 사용. 이것은 5-10 %의 속도를 제공하지만 며칠 후에 정밀 문제가 발생합니다. 이를 피하기 위해 정기적 인 간격으로 시간과 위치 값을 "재설정"하는 것이 가능할 수 있지만 논리는 상당히 복잡합니다.stdout 잠금 및/또는 버퍼링을 수동으로 처리합니다. Ternimal은 많은 양의 출력을 기록하지만,이 최적화는 1 %의 속도를 실망시키면서 버려졌습니다.format! 매크로는이 목적을 위해 이길 수 없으며, 내가 시도한 모든 대안은 동일하거나 느 렸습니다.target-cpu=native 와 같은 컴파일러 플래그와 함께 연주합니다. 이것은 또한 측정 가능한 개선을 제공하지 않았습니다.Callgrind 및 Oprofile을 사용하여 프로파일 링은 대부분의 CPU 시간이 출력 문자열을 구성하고 작성하는 데 소비되며 렌더링 계산은 매우 큰 모델의 역할 만 수행한다는 것을 보여줍니다. 출력 처리를 더 빨리 만들려고 노력한 성공이 부족하다는 점을 감안할 때 Ternimal의 성능이 이미 매우 만족 스럽다고 말하는 것이 합리적입니다.
Ternimal은 Linux, MacOS 및 Windows에서 테스트되었습니다.
Linux에서는 거의 모든 터미널 에뮬레이터가 삼 골을 완벽하게 만듭니다. MACOS에서는 ITERM2 또는 Alacritty가 권장됩니다. Windows에서는 PowerShell과 WSL이 잘 작동하는 것처럼 보이며 Conemu도 작동하지만 24 비트 색상이 부족합니다.
터미널이 24 비트 RGB 색상 탈출 시퀀스를 지원하지 않기 때문일 가능성이 높습니다. 이것은 아마도 MacOS의 기본 터미널을 사용하고 있음을 의미합니다. 이는 여전히 해당 기능이 누락 된 유일한 주요 터미널 에뮬레이터입니다.
두 가지 옵션이 있습니다.
true_color=false 실행하여 256 색 팔레트로 돌아가므로 실질적으로 모든 터미널 에뮬레이터가 지원하지만 (멋지게 보이지는 않습니다).글꼴의 블록 문자가 문자 셀을 완전히 채우지 않거나 터미널에 라인 간격이 0보다 크기 때문에.
3 차는 캐릭터 종횡비가 가능한 2 : 1에 가까운 글꼴과 가장 잘 작동합니다. 스크린 캐스트의 글꼴은 멋진 iosevka입니다.
Linux 콘솔은 유니 코드 글꼴을 지원하지 않습니다. 그러나 유니 코드 인코딩을 인식하는 것으로 보이며, 특정 유니 코드 코드 포인트를 내부 인코딩의 코드 포인트로 변환하려고 시도합니다.
그러나이 변환에는 버그가있는 것 같습니다. 상단 절반 블록 문자는 올바르게 번역되지만 하단 블록은 그렇지 않아 줄무늬 패턴이 생깁니다.
이와 같이:

기고자들은 항상 환영합니다. 그러나 특히 새로운 기능에 대한 풀 요청을 열기 전에 추가하려는 내용을 설명하는 문제를 제출하십시오 ! 나는 제가 원하는 것을 명확하게 (그리고 원하지 않는) 3 가지에 대한 명확한 비전을 가지고 있으므로 잠재적 인 추가를 논의하면 복제 및 낭비 된 작업을 피하는 데 도움이 될 수 있습니다.
기고함으로써 귀하는 프로젝트의 나머지와 동일한 라이센스로 변경 사항을 공개하는 데 동의합니다 (아래 참조).
Copyright © 2017 Philipp Emanuel Weidmann ([email protected])
GNU 일반 공개 라이센스의 조건에 따라 릴리스, 버전 3