SSH로 즐기는 멀티플레이어 스네이크 게임, 1초에 1억 픽셀 렌더링!
SSH를 통해 접속 가능한 멀티플레이어 스네이크 게임 'snakes.run' 개발
터미널 렌더링(Terminal Rendering)을 위해 유니코드 블록 요소(Unicode Block Elements) 사용 및 밴드위스 최적화
Bubbletea TUI 프레임워크(TUI Framework)와 Go SSH 라이브러리(Go SSH Library)를 포크하여 성능 개선
성능 프로파일링(Performance Profiling)을 통해 CPU 사용량 감소 및 동시 접속자 수 증가
터미널 렌더링 최적화: 밴드위스 절감
저자는 터미널 렌더링(Terminal Rendering) 시 밴드위스(Bandwidth) 사용량을 줄이기 위해 다양한 기법을 적용했다. 초기에는 각 프레임마다 전체 라인을 다시 전송하는 방식으로 인해 밴드위스 사용량이 과도하게 높았다. 이를 해결하기 위해 VT100 시퀀스(VT100 Sequences)를 사용하여 변경된 셀만 업데이트하는 방식으로 변경했다. 또한, 4-bit 색상 사용 및 문자열 캐싱(String Caching)을 통해 밴드위스 사용량을 추가적으로 절감했다.
성능 개선: CPU 사용량 최적화
성능 개선을 위해 저자는 CPU 프로파일링(CPU Profiling)을 통해 병목 지점을 파악하고, lipgloss 라이브러리(Library) 사용을 최소화했다. 특히, 문자열 연결 및 측정 함수를 직접 구현하여 문자열 할당(String Allocation) 관련 오버헤드를 줄였다. 또한, 배너(Banner)와 같은 고정 문자열을 미리 할당하는 문자열 캐싱(String Caching) 기법을 적용하여 가비지 컬렉션(Garbage Collection) 시간을 줄였다.
SSH 성능 튜닝: 키스트로크 타이밍 난독화 제거
저자는 SSH 클라이언트(Client)의 키스트로크 타이밍 난독화(Keystroke Timing Obfuscation) 기능을 비활성화하여 성능을 향상시켰다. 이 기능은 OpenSSH에서 보안을 위해 도입되었지만, 멀티플레이어 게임에서는 불필요한 오버헤드를 발생시켰다. 저자는 Go의 암호화 라이브러리(Crypto Library)를 포크하여 해당 기능을 제거함으로써 성능을 두 배로 향상시켰다.
아키텍처 개요: SSH를 통한 게임 실행
snakes.run은 SSH를 통해 접속하여 터미널에서 게임을 즐길 수 있도록 설계되었다. 게임 서버는 Bubbletea TUI 프레임워크(TUI Framework)를 사용하여 프레임을 렌더링하고, Go SSH 라이브러리(Go SSH Library)를 통해 클라이언트에 전송한다. 저자는 SSH의 기본적인 동작 원리를 활용하여, 터미널에 텍스트와 이스케이프 시퀀스(Escape Sequences)를 전송하는 방식으로 게임을 구현했다.