4P by neo 2달전 | favorite | 댓글 1개
  • Flappy Bird, only C, without Java/Kotlin, weight APK (armeabi-v7a +arm64-v8a) < 100 kilobytes

역사:

  • 2021년에 rawdrawandroid 저장소를 발견함
  • 가능한 한 작은 APK 크기의 간단한 게임을 만들고자 하는 동기가 생김
  • Flappy Bird 게임의 클론을 만들기로 결정함
  • 첫 시도는 C++와 ImGui를 사용하여 진행했으나 실패함
    • APK 크기가 약 1 메가바이트였음
    • 게임 충돌 가능성이 있었음
    • APK에 armeabi-v7a 라이브러리만 포함되어 있었음
    • 프로젝트 구조가 복잡하고 정리가 안 되어 있었음

동기:

  • 2024년 9월 14일 Raylib 디스코드 채널에서 C#으로 Flappy Bird를 만든 사람을 봄
  • C 언어로 Android용 APK 크기를 100킬로바이트 이하로 만드는 아이디어에 도전하고 싶어짐
  • 오늘날 APK 크기가 500메가바이트에 달하는 상황에서 100킬로바이트 이하로 유지하는 것은 매우 어려운 일임
  • 결국 성공했지만 쉽지 않았음

구현:

  • 처음에는 C로 Hello World를 컴파일하고, 라이브러리를 APK로 패키징하여 USB를 통해 장치로 전송함
  • 게임의 리소스를 탐색하기 시작함
  • 처음에는 ogg 형식의 소리를 사용했으나 문제 발생, 이후 mp3 형식으로 변경하여 압축함
  • BASS를 사용하여 소리를 재생하려 했으나 무거워서 OpenSLES를 공부하여 MP3 형식을 문제없이 읽도록 함
  • png 이미지를 사용하고, stb_image보다 가벼운 upng를 찾아 디코딩 문제를 해결함
  • OpenGL ES 2 + 셰이더로 렌더링, OpenSLES로 소리 재생, upng로 png 디코딩, Android Native Activity 사용

빌드:

  • Visual Studio 2022 다운로드
    • Visual Studio Installer 열기
    • "Edit" 클릭
    • C++ 클래식 애플리케이션 개발, C++ 모바일 애플리케이션 개발 항목 선택
  • Android Studio 다운로드 (apktool, sdk, ndk 필요)
    • NDK 25.2.9519653 설치 (상위 버전 사용 가능)
  • 프로젝트 설정은 "Debug ARM"으로 되어 있으나 build.bat에서 경로 수정 필요
  • CTRL + B로 컴파일

저작권:

  • 저작권 주장하지 않음. 게임과 리소스의 권리는 DotGEARS에 있음

영감:

  • rawdrawandroid
  • Flapper
  • Raylib
  • ImGui

GN⁺의 정리:

  • 이 프로젝트는 C 언어로 Android용 Flappy Bird 게임을 만들고자 하는 도전적인 시도임
  • APK 크기를 100킬로바이트 이하로 유지하면서도 게임을 구현하는 데 성공함
  • OpenGL ES 2, OpenSLES, upng와 같은 다양한 기술을 사용하여 리소스를 최적화함
  • 이 프로젝트는 소프트웨어 엔지니어에게 작은 크기의 효율적인 게임 개발에 대한 통찰을 제공함
  • 비슷한 기능을 가진 프로젝트로는 Raylib과 rawdrawandroid가 있음
Hacker News 의견
  • 앱 스토어에 "10MB 이하 앱" 필터가 있었으면 좋겠음

    • 작은 앱들이 더 빠르고 광고나 마이크로 결제가 적음
    • 3MB의 온도계 앱이 150MB의 온도계 앱보다 더 만족스러움
  • Flappy Bird를 왜 사람들이 플레이하는지에 대한 문헌 리뷰를 작성한 경험 공유

  • Nim으로 비슷한 프로젝트를 2020년에 출판한 경험 공유

    • Dalvik 바이트코드와 .apk 파일을 위한 어셈블러 작성
    • 코드가 오래되어 다시 살려보고 싶음
    • 유튜브 링크: https://youtube.com/watch/…
  • 코드가 4k loc 이하임

    457 android_native_app_glue.c
    360 audio.c
    802 game.c
    201 init.c
    93 main.c
    39 mouse.c
    38 shaders.c
    229 texture.c
    1377 upng.c
    27 utils.c
    3623 total
    
  • Super Mario Bros는 40KB였음

  • 안드로이드 APK를 만들기 위해 자바 글루잉이 필요하다고 생각했음

  • 1MB 이하의 안드로이드 앱을 보는 것이 정말 멋짐

    • 오래된 HTC에서도 실행 가능함
    • 축하함
  • "Floppy Bird"라고 이름 지었으면 좋았을 것 같음

    • 3.5인치 플로피 디스크에 들어갈 수 있음
  • 기존의 부풀려진 서드파티 컴포넌트 대신 "정성스럽게 제작된" 프로그램/게임/앱을 보는 것이 상쾌하고 좋음

  • rawdrawandroid를 사용하여 C 애플리케이션을 안드로이드에서 작성하는 기술이 raylib (및 다른 C 프레임워크)도 사용할 수 있는지 궁금함

    • Termux를 통해 안드로이드에서 안드로이드용 C 개발 환경을 사용할 수 있는지 궁금함