SSH로 즐기는 멀티플레이어 스네이크 게임, 초당 1억 픽셀 렌더링!

by DD
3주 전
조회수 10

SSH를 통해 접속 가능한 멀티플레이어 스네이크 게임 'snakes.run' 개발

터미널 렌더링(Terminal Rendering)을 위해 유니코드 블록 요소(Unicode Block Elements)와 VT100 시퀀스(VT100 Sequences) 활용

밴드위스(Bandwidth) 최적화를 위해 상태 기반 렌더링(Stateful Rendering) 및 4비트 색상 사용

성능 개선(Performance Improvement)을 위해 문자열 할당(String Allocation) 최소화 및 SSH 설정 조정

터미널 렌더링 최적화: 밴드위스 절감 전략

개발자는 초기 렌더링 방식에서 초당 35KB의 밴드위스를 사용했으나, 상태 기반 렌더링(Stateful Rendering)VT100 시퀀스(VT100 Sequences)를 활용하여 밴드위스 사용량을 4.5KB/sec로 줄였다. 특히, 변경된 셀만 업데이트하는 방식으로 렌더링하여 불필요한 데이터 전송을 최소화했다. 또한, 4비트 색상 사용을 통해 색상 관련 데이터 전송량(Data Transfer)을 추가적으로 감소시켰다.

성능 개선을 위한 문자열 처리 최적화

성능 프로파일링 결과, 문자열 처리(String Handling)에 상당한 CPU 자원이 소모되는 것을 확인했다. 이에 따라, 개발자는 lipgloss 라이브러리 사용을 줄이고, 문자열 연결(String Concatenation) 및 측정 기능을 직접 구현했다. 또한, 사전 할당(Pre-allocation)을 통해 가비지 컬렉션(Garbage Collection) 시간을 획기적으로 줄여 전체적인 성능을 향상시켰다.

SSH Keystroke Timing Obfuscation 문제 해결

개발자는 SSH 클라이언트의 키스트로크 타이밍 난독화(Keystroke Timing Obfuscation) 기능으로 인해 서버 성능이 저하되는 문제를 발견했다. 이 기능을 비활성화하기 위해 go의 암호화 라이브러리를 포크(Fork)하여 수정하는 과정을 거쳤다. 이로 인해 게임의 전반적인 성능(Overall Performance)이 약 2배 향상되었으며, 더 많은 동시 접속자를 지원할 수 있게 되었다.

아키텍처 및 기술적 트레이드오프 분석

본 게임은 터미널 기반(Terminal-based)으로 구현되어, 그래픽 사용자 인터페이스(GUI) 기반 게임에 비해 렌더링 성능에 제약이 있다. 하지만, SSH를 통해 접근성을 높이고, TUI(Text-based User Interface) 프레임워크를 활용하여 멀티플레이어 환경을 구축했다. 유니코드 블록 요소(Unicode Block Elements)를 사용하여 픽셀 단위의 렌더링을 구현했지만, 터미널의 특성상 세밀한 제어에는 한계가 존재한다.

snakes.run: rendering 100M pixels a second over ssh · eieio.games