이유 없이 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와 잘 어울리는지 궁금함
 
 - 
훌륭한 게임 엔진처럼 보임
- 왜 기사에서 거의 수명이 다했다고 언급하는지 궁금함
 - 더 나은 새로운 엔진이 있는지 궁금함