JavaScript 게임 개발
Categories:tech
JavaScript 게임 개발
발생
요즘 회사 점심 시간마다 게임을 만들고 있는데 js 로 만든 게임은 얼마나 있을까 찾아보니 제일 대박친 게임은 뱀파이어 서바이벌이어서 조금 더 자세히 알아보니 js 게임용 프레임워크인 Phaser 라이브러리를 이용해서 개발했다는 사실을 알았다. 근데 뱀파이어 서바이벌이 최적화 문제로 최근 Unity 엔진으로 마이그레이션을 진행한다는 소식도 같이 발견하였다.
나는 의문이 들었다 js로 게임 개발 시 성능의 한계로 최적화가 불가능한 경우가 있을까? js의 구조적 한계인 싱글스레드를 극복 할 수 있는 다양한 기술들이 있을텐데 왜 뱀서는 결국 Unity 엔진으로 마이그레이션을 진행하였을까?
한번 알아보도록 하자…
원인
우선 뱀파이어 서바이벌 개발자들은 어째서 게임 엔진을 변경했는지 알아보자.
- 성능 향상을 위해
- 플랫폼 확장성을 위해
- 기능 확장 및 업데이트 용이를 위해
- 산업 표준을 위해
결국 Unity 엔진으로 변경한 이유는 기존 Phaser 엔진이 성능상 문제가 존재했고 다른 기기/플랫폼으로 포팅 하기에도 쉽지 않았으며 다양한 기능을 추가할 때 더 많은 노력이 필요했기에 변경을 감행한거 같다.
확실히 여러면으로 보았을 때 UInity로 엔진을 마이그레이션 하려고 한 결정은 합당한거 같다. 하지만…
난 여기서 성능상 문제를 들었을 때 상당히 아쉬움을 느꼈다. 나는 개인적으로 js 언어를 상당히 좋아하는 입장에서 여러 프로젝트들에서 성능상 문제로 인해 다른 언어로 마이그레이션을 진행했다는 이야기를 들을 때마다 js에 한계가 있다고 말하는 것에 왠지모를 답답함을 느끼고 있었다.
왜 js는 한계가 존재할까 어쩌면 한계를 극복한 사람들이 있지 않을까 싶어 한번 찾아보았다.
한계
결론부터 말하자면 순수 js 만으로는 성능상 한계가 명확하다…
성능의 한계
- 싱글 스레드
기본적으로 js는 메인 스레드 하나에서만 실행된다. 이는 여러 연산(물리, 오디오, 렌더링, 네트워킹, AI 등)을 동시에 수행 해야하는 게임과는 맞지 않다. 물론 Web Workers를 쓰면 병렬화가 가능하긴 하지만 공유 메모리, 락, 세마포어 관리가 제한적이고 컨텍스트 전환 비용도 크다.
- JIT
js는 JIT 컴파일로 최적화를 진행한다. 물론 이렇게 최적화된 결과도 좋은 성능을 가지지만 네이티브 언어들의 사전 컴파일(AOT)에 비하면 일관성과 속도면에서 손해를 본다. 특히 cpu 집약적인 루프는 JIT이 매번 최적화, 디옵트(deoptimization) 과정을 반복해서 프레임 타임이 불규칙 해질 수 있다.
- GC
보통 게임은 60-120fps 안에 모든 게임 루프를 처리 해야하지만 js의 gc는 언제 발생할지 예측이 불가능해서 프레임 드랍, 입력 지연 발생 할 수 있다.
저수준 자원
순수 js 만으로는 수동 메모리 관리가 불가능하다. 게임에서는 캐쉬 친화적 메모리 배치(AoS, SoA), 풀링(pooling) 등의 기법으로 cpu 캐시 효율 극대화가 필수인데 js는 이런 최적화가 불가능하다. 또한 SIMD 명령어를 직접적으로 호출 할 수 없고 gpu에도 직접 접근 할 수 없다.
플랫폼, 런타입 제약
js는 항상 js 엔진 위에서 돌아가기에 엔진 자체의 자원 소모가 존재하고 결국 저수준 자원에 직접 접근하지 못한다.
그럼에도
js의 성능 한계를 극복 할 수 있는 WebAssembly(WASM), WebGPU, Native Runtime(Node.js, Deno) 등으로 물론 순수 js 만으로는 아니지만 여타 다른 언어들에 밀리지 않는 성능의 소프트웨어를 개발 할 수 있다.
결론
순수 js 만으로는 태생적 한계로 인해 엄청난 성능을 이끌어 낼 수는 없지만 js를 브릿지로 이용해 외부 언어들을 사용해 저수준 자원을 활용한다면 js의 성능 한계를 극복 할 수 있다.
js의 태생적 한계로 인해 js를 직접적으로 체질을 변경 시키려 했던 경우도 있지만 js의 정체성을 유지시키고 외부의 요소들과 잘 어우러지도록 js 생태계의 개척자들은 js를 변화시켰던 것이었다.
성능상 한계가 나에게는 아쉽게 느껴지지만 js의 정체성이 훼손되는것 보다는 이게 더 좋은 선택인거 같기도하다.
Day-5
tech [[2025-09-13-AoS, SoA]] [[2025-09-13-Pooling]] [[2025-09-13-SIMD]]