GN⁺: 이유 없이 JavaScript 게임 엔진을 C로 포팅
(phoboslab.org)high_impact: JavaScript 게임 엔진을 C로 포팅하기
요약
- high_impact는 2D 액션 게임을 위한 작은 게임 엔진으로, C로 작성되어 Windows, Mac, Linux 및 웹을 위한 WASM으로 컴파일 가능함
- 2010년의 JavaScript 게임 엔진 Impact에서 영감을 받았으며, MIT 라이선스로 제공됨
- 소스 코드: GitHub
고대 역사
- 2010년 4월, Steve Jobs는 "Thoughts on Flash"라는 공개 서한을 통해 iOS에서 Flash를 지원하지 않겠다고 발표함
- Flash는 웹에서 매우 중요한 브라우저 플러그인이었으며, 많은 웹사이트가 Flash 게임과 애니메이션에 의존했음
- Android는 Flash를 지원했지만 성능이 좋지 않았고, Apple의 결정은 Flash의 종말을 알리는 신호였음
- JavaScript Canvas2D API를 사용하여 Flash 없이도 웹 게임을 만들 수 있음을 증명하기 위해 Biolab Disaster를 개발함
왜 C인가?
- C는 간단하면서도 깊이 있는 언어로, 게임 개발에 적합함
- JavaScript MPEG1 디코더를 C로 포팅하고, VR 구현, 이미지 및 오디오 포맷 개발 등을 통해 C에 대한 애정을 다시 발견함
- Impact를 C로 다시 작성하는 것은 재미있는 연습이 될 것임
개념
- high_impact는 최소한의 코드로 구현되었으며, 타일 맵 로딩, 게임 객체 생성, 업데이트 및 그리기 기능을 제공함
- 물리 및 충돌 감지를 처리하며, 간단한 스프라이트 시트 애니메이션, 텍스트 그리기, 사운드 효과 및 음악 재생 기능을 포함함
- high_impact는 라이브러리가 아닌 프레임워크로, 사용자가 비즈니스 로직을 작성해야 함
- SDL 또는 Sokol 플랫폼 백엔드를 사용하여 컴파일 가능함
엔티티
- 모든 엔티티는 동일한
entity_t
구조체를 공유하며, 위치, 속도, 크기 등의 속성을 가짐 - 매크로를 통해 기본 엔티티 구조체를 확장할 수 있음
- 각 엔티티 유형은 함수 포인터를 제공하는
entity_vtab_t
를 제공해야 함 - 최대 64k의 활성 엔티티를 처리할 수 있음
충돌 감지 및 대응
- 타일 맵과의 충돌을 계산하여 정확한 충돌 지점을 찾음
- 엔티티 간의 충돌은 별도로 처리되며, 각 엔티티는 다른 엔티티와 어떻게 충돌할지 정의함
렌더링
- OpenGL 및 소프트웨어 렌더러를 제공함
- 모든 렌더링은 단일 함수 호출을 통해 이루어지며, 텍스처 아틀라스를 사용하여 텍스처를 결합함
사운드
- SDL2 또는 Sokol을 사용하여 사운드 출력을 처리함
- 고정된 수의 소스를 로드하고, 고정된 수의 사운드를 재생할 수 있음
- 사운드는 자동으로 폐기되어 재사용 가능함
메모리 관리
- 단일 바이트 배열인 "hunk"를 사용하여 메모리를 관리함
- bump allocator와 temp allocator를 사용하여 메모리를 할당함
- 메모리 해제를 자동으로 처리하여 사용자가 메모리 관리에 대해 신경 쓸 필요가 없음
레벨 에디터
- 원래의 Impact 레벨 에디터인 "Weltmeister"를 포함함
- JavaScript로 작성되었으며, 현대 브라우저 기능을 사용하여 업데이트됨
- 파일 시스템 API를 사용하여 파일을 로드하고 저장함
데모 게임
- Biolab Disaster와 Drop 두 가지 게임을 C로 포팅하여 high_impact의 기능을 검증함
확장성
- high_impact는 전통적인 게임 엔진으로, 게임별 코드는 추가적으로 작성됨
- 플랫폼 및 렌더러는 다른 시스템을 지원하도록 확장 가능함
GN⁺의 정리
- high_impact는 C로 작성된 2D 게임 엔진으로, 간단하면서도 강력한 기능을 제공함
- JavaScript 게임 엔진 Impact의 후속작으로, 다양한 플랫폼에서 실행 가능함
- 메모리 관리와 충돌 감지 등 게임 개발에 필요한 핵심 기능을 간단하게 구현함
- 레벨 에디터와 데모 게임을 통해 실제 사용 사례를 제공함
- Unity나 Unreal과 같은 대형 엔진에 비해 가볍고 간단한 프로젝트에 적합함
Hacker News 의견
-
많은 웹 게임들이 Impact 게임 엔진으로 만들어졌으며, Cross Code, Eliot Quest, XType Plus 같은 상업용 크로스 플랫폼 타이틀의 기반이 되었음
- Cross Code는 뛰어난 게임이며, 웹 기술을 사용한 점이 인상적이었음
- 이 엔진이 Nintendo Switch 하드웨어에서 높은 성능을 발휘하는 데 기여했을 것이라고 생각함
-
"Thoughts on Flash"는 웹 플랫폼을 구원했을 수 있음
- Adobe가 MacOS 플랫폼 지원을 포기한 것에 대한 좌절감이 있었을 것임
- Mac 버전이 항상 Windows 버전보다 뒤쳐졌음
- Jobs는 Adobe가 Apple 없이는 존재하지 않을 것이라고 생각했을 수 있음
-
게임이 매우 깔끔해 보임
-
high_impact는 "라이브러리"가 아니라 "프레임워크"임
- 비즈니스 로직을 프레임워크 안에 작성해야 함
- 프레임워크는 다른 것들과 잘 어울리지 않는 "라이브러리"라고 부정적으로 표현하곤 했음
- 긍정적인 표현을 들으니 좋음
-
오랜만에 HN 계정에 로그인하여 Biolab Disaster를 다시 찾게 되어 기쁨
-
UNION을 사용하여 다형성 엔티티 데이터 구조를 만든 것이 인상적임
- C 언어를 여전히 좋아하며, 처음 배운 언어였음
- C는 간결한 언어이지만 깊이 있게 다룰 수 있음
- 게임이 Commander Keen 같은 느낌을 주며, 그 프랜차이즈를 좋아했음
-
QOI 무손실 파일 형식과 7Zip을 결합하면 무손실 PNG보다 성능이 뛰어남
-
플레이어의 배터리 수명을 존중하기 위해서일 수 있음
-
재미있는 아이디어, 최대 학습 가치를 위한 오픈 소스, 완벽한 실행, 허영심 없는 명확한 작성—멋진 기여임
- 이런 것을 보는 것만으로도 특권을 느낌
-
3000명의 라이센스 소유자 중 한 명으로서 Impact의 부활을 기쁘게 생각함
- Zig와 잘 어울리는지 궁금함
-
훌륭한 게임 엔진처럼 보임
- 왜 기사에서 거의 수명이 다했다고 언급하는지 궁금함
- 더 나은 새로운 엔진이 있는지 궁금함