5P by neo 1달전 | favorite | 댓글 1개

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와 잘 어울리는지 궁금함
  • 훌륭한 게임 엔진처럼 보임

    • 왜 기사에서 거의 수명이 다했다고 언급하는지 궁금함
    • 더 나은 새로운 엔진이 있는지 궁금함