GN⁺: 안드로이드용 Flappy Bird, C 언어로 작성, 100KB 이하
(github.com/VadimBoev)- 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를 왜 사람들이 플레이하는지에 대한 문헌 리뷰를 작성한 경험 공유
- 게임 연구 대학원생 시절의 일임
- 논문 링크: http://www.fdg2015.org/papers/fdg2015_paper_60.pdf
-
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를 만들기 위해 자바 글루잉이 필요하다고 생각했음
- 이 프로젝트에서 자바 파일이 없어서 놀라움
- rawandroid 프로젝트도 참고할 가치가 있음
- 링크: https://github.com/cnlohr/rawdrawandroid/tree/master
-
1MB 이하의 안드로이드 앱을 보는 것이 정말 멋짐
- 오래된 HTC에서도 실행 가능함
- 축하함
-
"Floppy Bird"라고 이름 지었으면 좋았을 것 같음
- 3.5인치 플로피 디스크에 들어갈 수 있음
-
기존의 부풀려진 서드파티 컴포넌트 대신 "정성스럽게 제작된" 프로그램/게임/앱을 보는 것이 상쾌하고 좋음
-
rawdrawandroid를 사용하여 C 애플리케이션을 안드로이드에서 작성하는 기술이 raylib (및 다른 C 프레임워크)도 사용할 수 있는지 궁금함
- Termux를 통해 안드로이드에서 안드로이드용 C 개발 환경을 사용할 수 있는지 궁금함