- Flappy Bird、Java/KotlinなしのCのみ、軽量APK(armeabi-v7a +arm64-v8a) < 100キロバイト
歴史:
- 2021年に rawdrawandroid リポジトリを発見
- できるだけ小さいAPKサイズのシンプルなゲームを作りたいという動機が生まれる
- Flappy Bird ゲームのクローンを作ることに決定
- 最初の試みは C++ と ImGui を使って進めたが失敗
- APKサイズは約1メガバイトだった
- ゲームがクラッシュする可能性があった
- APKには armeabi-v7a ライブラリのみが含まれていた
- プロジェクト構造が複雑で整理されていなかった
動機:
- 2024年9月14日、Raylib の Discord チャンネルで 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 がある
1件のコメント
Hacker Newsの意見
App Storeに「10MB以下のアプリ」フィルターがあればいいのに
なぜ人々がFlappy Birdをプレイするのかについて文献レビューを書いた経験の共有
Nimで似たようなプロジェクトを2020年に公開した経験の共有
コードは4k loc以下
Super Mario Brosは40KBだった
Android APKを作るにはJavaのグルーコードが必要だと思っていた
1MB以下のAndroidアプリを見るのは本当にクール
「Floppy Bird」という名前にしていたらよかったかもしれない
既存の膨れ上がったサードパーティ製コンポーネントではなく、「丁寧に作り込まれた」プログラム/ゲーム/アプリを見るのは新鮮で気持ちがいい
rawdrawandroidを使ってAndroid上でCアプリケーションを書く技術が、raylib(および他のCフレームワーク)でも使えるのか気になる