피드로 돌아가기
Dev.toFrontend
원문 읽기
개발자가 LÖVE2D 게임 엔진을 Rust로 재구현해 상용 게임을 터미널에서 실행
How I Reimplemented LÖVE2D in Rust to Play Balatro in a Terminal
AI 요약
Context
Balatro는 Lua 기반 게임 프레임워크인 LÖVE2D 위에서 구축되어 있습니다. LÖVE2D는 그래픽, 오디오, 입력 API를 GPU 렌더링 윈도우에 제공하도록 설계되었습니다. 터미널 환경에서 전체 상용 게임을 실행하려면 이러한 그래픽 API를 새로운 렌더링 대상에 맞게 재구현해야 했습니다.
Technical Solution
- LÖVE2D API 호환성 구현: 약 80개의 LÖVE2D 함수를 Rust로 재구현하여 Balatro의 Lua 코드를 수정 없이 실행할 수 있도록 함
- 소프트웨어 래스터라이저 개발: 안티앨리어싱 처리된 사각형, 타원, 다각형, 굵은 선, 쌍선형 필터링 스프라이트, TTF 텍스트, 캔버스 시스템, 스텐실 버퍼, 블렌드 모드를 포함한 완전한 2D 렌더링 파이프라인을 graphics.rs에서 3,400줄 이상으로 구현
- 다중 터미널 렌더링 방식 지원: Sixel 그래픽(최고 품질, 700×350+ 픽셀), Unicode 옥탄트 문자(2×4 서브픽셀 해상도), 반블록 폴백(기본 터미널 호환성) 중 선택 가능하도록 구현
- 픽셀 버퍼 변환 시스템: RGBA 픽셀 버퍼를 터미널 출력으로 변환하는 sprite-to-text 렌더러를 통해 해상도 자동 조정(TUI_PIXELBUDGET으로 제어)
- GLSL 셰이더 에뮬레이션: CRT 셰이더, 홀로그래픽 셰이더, 폴리크롬 셰이더 등 11개의 GPU 셰이더를 CPU에서 픽셀 단위로 Rust로 재구현
- 호환성 어댑터 추가: love.system.getOS() 스터브, luasteam 더미 모듈, LuaJIT bit 라이브러리 Rust 구현, 키보드-게임패드 이벤트 매핑을 통해 게임 로직 수정 없이 실행
Impact
- CPU 기반 렌더링으로 기본 설정(250K 픽셀 예산) 시 50~60 FPS 달성
- 약 9,800줄의 Rust 코드로 완전한 게임 실행 환경 구축
Key Takeaway
호환성 레이어를 통해 기존 게임 로직을 수정하지 않으면서도 완전히 다른 렌더링 백엔드에서 실행할 수 있음을 보여줍니다. 이는 게임 엔진의 모듈 분리 설계와 API 추상화의 가치를 입증합니다.
실천 포인트
기존 게임이나 애플리케이션을 새로운 플랫폼으로 포팅할 때, 핵심 게임 로직은 건드리지 않고 렌더링, 입력, 오디오 API 계층만 새로 구현하는 어댑터 패턴을 사용하면 포팅 복잡도를 크게 줄일 수 있습니다.