갤럭시S20+ 서버에서 굴러가는 슈팅게임 예시
갤럭시S20+ 는 1 프라임코어 3 골드코어 4 이코노미코어인 8코어 CPU이고
램이 unified 12GB(실제로 5GB available) 정도됩니다
안드로이드와 삼성앱이 기계의 자원을 감시하고 있기 때문에 여러가지 제약이 있습니다
어쨋든 공유기로부터 유선랜을 허브를 통해 연결하고 허브전력은 UPS에 통해 안정적으로 공급받으며
스마트폰은 85%까지만 충전되도록 하고 스마트폰의 일반 기능은 adb로 싹다 없애서 서버로서 최적화 된 상태
termux, termux:boot (ubuntu의 systemd 역할) 이 2가지 앱을 사용해서 서버로 운영합니다
프론트엔드는 cloudflare dns cdn pages 를 통한 rust wasm 웹앱이고
백엔드는 cloudflared tunnel wss 로 연결된 rust 빌드 was 입니다
(wgpu simd rayon bytemuck tokio 등 메모리,통신,그래픽연산쪽에 최대한 최적화)
게임은 단순한 슈팅게임이지만 멀티플레이도 아니지만 서버authority로 계산되기 때문에 보간 문제가 결국 핵심입니다
게임을 해보면 아시겠지만 중간에 jitter을 완벽히 잡지는 못했어요
하지만 프론트엔드, tunnel wss 연결, 백엔드 서버 cpu mem 발열 등 기계자원 문제는 아니고(단지 tunnel wss의 네트워크 jitter는 어쩔 수 없는 문제이고 갤럭시폰의 안드로이드/삼성의 자원 스케줄링 문제도 어쩔 수 없는 문제지만) 중간중간 jitter의 주요 병목은 주로 보간 알고리즘의 문제인 것으로 보입니다
보간 알고리즘 최적화는 아직 중반정도 밖에 안 했지만..
이런 게임은 멀티플레이가 아니라면 그냥 local-first로 클라이언트 프론트엔드에서 거의 다 처리하고 서버에서는 주요 판정만 하고 기록만 하는 쪽으로 가면 훨씬 가벼워지고 실시간 플레이의 jitter도 거의 없앨 수 있겠죠
어쨋든 저는 갤럭시S20+가 2대가 있는데 1대에 월 500원의 전기료로 서버팜을 만들어 보고 싶네요
어떤 작업장에는 구형 폰 100대를 클러스터로 묶어서 월 5만원의 전기료로 800코어를 돌린다고 하던데요