- Bu proje, Android için Flappy Bird klonunu C ile geliştirirken APK boyutunu 100 KB’ın altına indirmeyi hedefliyor
- 2021’de rawdrawandroid ile tanıştıktan sonra küçük APK boyutuna sahip bir oyun yapmak istendi; Eylül 2024’te Raylib Discord’da C# Flappy Bird’ün görülmesi de C ile uygulama denemesinin çıkış noktası oldu
- Uygulama, C ile yazılmış yerel bir kütüphaneyi APK içine paketleyip OpenGL ES 2, shader’lar ve Android Native Activity’yi bir araya getiren bir yöntem kullanıyor
- Sesler MP3 olarak sıkıştırılıyor ve OpenSLES ile çalınıyor; PNG çözümleme için upng kullanılıyor
- Derleme, Windows’ta Visual Studio Code’u ve Linux/macOS’ta Makefile’ı destekliyor; oyun ve kaynak haklarının DotGEARS’a ait olduğu belirtiliyor
Proje hedefi ve arka plan
- Flappy Bird in C, Android’de çalışan bir Flappy Bird klonunu C ile yazmayı ve APK boyutunu 100 KB’ın altında tutmayı amaçlayan bir proje
- Çıkış noktası, 2021’de karşılaşılan rawdrawandroid idi; hedef, APK boyutunu en aza indirirken anlaşılır ve ilgi çekici bir oyun yapmaktı
- Flappy Bird, hâlihazırda birçok dile taşınmış örneği bulunduğu için klon uygulaması için doğal bir seçim oldu
Önceki denemeler ve sorunlar
- 2021’de Raylib incelendi; ImGui kullanarak C++ ile oyun yapmaya yönelik ilk deneme başarısız oldu
- O dönemde birden fazla sorun vardı
- APK boyutu yaklaşık 1 MB idi
- Oyun çöküyordu
- APK yalnızca armeabi-v7a kütüphanesini içeriyordu
- Google’ın 2022 gereksinimleri gereği arm64-v8a kütüphanesinin de dahil edilmesi gerekiyordu
2024’te yeniden deneme motivasyonu
- Eylül 2024’te Raylib Discord kanalında C# Flappy Bird görüldükten sonra, Android için Flappy Bird’ü C ile geliştirip APK’yı 100 KB’ın altına indirme denemesi başladı
- Hedef gerçekçi görünmese de rekabetçi merak, geliştirme motivasyonu oldu
Uygulama yöntemi
- Başlangıç, C ile yazılmış bir Hello World’ü derleyip bu kütüphaneyi APK olarak paketleme çalışmasıydı
- Sesler MP3 formatında sıkıştırılıyor ve OpenSLES kullanılarak çalınıyor
- PNG dosyalarını çözümlemek için upng seçildi
- Grafikler ve Android entegrasyonu için OpenGL ES 2, shader’lar ve Android Native Activity birlikte kullanılıyor
Derleme yöntemi
- Windows’ta temel alınan ortam Visual Studio Code
.env.exampledosyasından.envoluşturunbuild.batdosyasını çalıştırın
- Linux ve macOS’ta sağlanan Makefile ile derlenebilir
- Android command-line tools kurulumu gerekir
- Proje kökündeki
.envdosyasında ortam değişkenlerini ayarlayın cd FlappyBirdardındanmakekomutunu çalıştırın
- Daha ayrıntılı derleme adımları için
BUILDING.mddosyasına bakılması öneriliyor - İmzalı APK,
FlappyBird/app/build/outputs/apk/FlappyBird-signed.apkkonumunda oluşturulur
Telif hakkı ve referans projeler
- Proje yazarı telif hakkı iddia etmiyor; oyun ve kaynak haklarının DotGEARS’a ait olduğunu belirtiyor
- İlham alınan projeler şunlar
1 yorum
Hacker News yorumları
Uygulama mağazasında yalnızca 10 MB altındaki uygulamaları göster filtresi olmasını isterdim
En hızlı, en az reklam ve mikro ödeme içeren uygulamalar genelde küçük olanlar oluyor
150 MB’lık bir termometre uygulaması yerine 3 MB’lık bir termometre uygulaması indirdiğimde çok daha memnun kalma ihtimalim yüksek
O uygulamaların hepsi 200 KB’ın altındaydı; gerçekten çok küçüktüler
İşe alımcılar, artık var olmayan ya da arka uç sunucuları kapanmış uygulamalar için bile, sanki bir sanat portföyüymüş gibi gösterilebilir çıktılar istiyordu
Daha da keyfi ölçüt ise birinin büyük uygulamalar yapıp yapmadığını görmek istemeleriydi; yetkin görünsün diye bir sürü optimizasyon tekniği kullanıp paketi 8–12 MB’a indirdiğinizde, bu uygulamanın, servisin ve kullanıcı tabanının küçük olduğu sinyali gibi algılanıyordu
Oysa gerçekte yüz milyonlarca indirme ve kullanıcıya sahip olsanız bile bunun o ölçütle hiçbir ilgisi yoktu ve bu alanda şişkin uygulamalar üretmek için muazzam teşvikler var
Örneğin reklam içeren bir termometre uygulamasında 7 MB üstünü bulmak için 9 tanesine bakmam gerekti
Her iki platformda da yıllarca çalıştım ama tam nedenini bilmiyorum; tahminimce Android tarafında bitmap’lere kıyasla vektör sanat geleneği çok daha güçlü ve Swift kütüphaneleri de ABI kararlılığı sayesinde işletim sistemi tarafında dinamik bağlama kullanılmadan önce yıllarca uygulamanın içine derlenmek zorundaydı
Keşke ücretli, reklamsız ve bazen uygulama içi satın alma da olmayan uygulamalar için filtreleme yapılabilse
Biraz yan konu ama, zamanında insanların neden Flappy Bird oynadığı üzerine bir literatür taraması yazmıştım
O sırada oyun araştırmaları alanında yüksek lisans öğrencisiydim; sonunda akademiye gitmedim ama eğlencesine paylaşayım dedim
Merak edenler için burada [1]
[1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf
Bir yandan oyunun kendisinde gerçek bir ilerleme ya da zorluk artışı yok. Mevcut skorunuz 0 da olsa 10 da olsa 100 de olsa zorluk aynı kalıyor
Ama her yeni en yüksek skor, oyuncunun aşması gereken yeni bir zirveye dönüşüyor. İlk ve belki de en sinir bozucu zirve 1 puan almak; çift haneli skorlara ulaşmak için tam fizik ve zamanlamayı içeren temel kontrolü esasen ustalaştırmanız ve çeşitli durumlarla baş etmeyi öğrenmeniz gerekiyor
Üç haneli skorlara giden engeller ise neredeyse insanın kendi yarattığı şeyler gibi görünüyor; kendi en yüksek skorunuza yaklaştığınızda duyulan korku ve gerginlik, rekor kırmanın önündeki en büyük engel oluyor
O en yüksek skoru bir kez geçince, bir dahaki sefere oraya yaklaşırken el titremesi sihirli biçimde kayboluyor; ama yeni bir en yüksek skora yaklaşıldığında yeniden ortaya çıkıyor
Temel oynanış fikri aldatacak kadar basit, ama içine bakmak isteyenler için çözülecek çok katman var
https://www.foddy.net/Athletics.html
4 bin satırın altında
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
O kadar karmaşık bir program değil; açıkçası 4 bin satır bile bana fazla geliyor
2020’de Nim ile benzer bir şey yapıp yayımlamıştım, ama grafikleri daha az hoştu
Farkı, işi daha da derine götürüp Dalvik bytecode ve .apk dosyaları için assembler bile gerçekten yazmış olmamdı
https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
Depodaki kod maalesef zamanla bozuldu; bazen bir gün yeniden canlandırmayı düşünüyorum
Biraz daha cilalı olsaydı kolayca yapılabilecek uygulamalar aklıma geldiği oluyor
Gerçekten harika
1 MB altı Android uygulamalarının eski HTC telefonlarda bile her yerde çalıştığını görmek güzel
Android APK oluşturmak için Java bağlayıcı kodu gerektiğini düşünüyordum; bu projeyi görünce hoşuma gitti
0 Java dosyası olması harika
Başkalarının bahsettiği rawandroid projesine de bakmaya değer
https://github.com/cnlohr/rawdrawandroid/tree/master
Ne yaparsanız yapın çalıştırmak için bir Activity örneği gerekiyor ve bunu C'de de oluşturabilirsiniz ama Java'da kalıtımla büyük ölçüde halledilen çok fazla şablon kod gerekiyor
Saf C'de bu şekilde yapılıyor: https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi... https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi...
Super Mario Bros yalnızca 40KB idi
https://news.ycombinator.com/item?id=21213421
Bu Flappy Bird klonu ise donanım ve yazılım yapılandırmaları birbirinden farklı sayısız cihazda çalışıyor
3.5 inçlik disketin içine sığıyorsa adını Floppy Bird koyma fırsatı kaçırılmış
En göze çarpanı, kuş yerine disket simgesi kullanan basit bir kaplama değiştirilmiş sürüm
Tabii ‘angry birds’ de ‘ongry beards’ oluyor
rawdrawandroid ile Android için C uygulaması oluşturma tekniği, raylib gibi diğer C framework'lerine de uygulanabilir mi?
Ve bu geliştirme sistemini Termux üzerinden kullanarak, Android üzerinde Android için bir C geliştirme ortamı da kurulabilir mi?
raylib projelerimde kullandığım biraz yarım kalmış bir build script'im var
Elbette imzalama işinin daha düzgün yapılması gerekir, aarch64 dışındaki hedefleri de build etmek isteyebilirsiniz ve SDK da /home/denis altında kurulu olmayabilir
Ayrıca .so dosyalarını apk'ye ekleme yönteminin modern Android'in tercih ettiği yöntem olduğundan emin değilim ama hâlâ çalışıyor
https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
“Android için” deniyorsa bu Java kullanılabileceği anlamına gelir ve bytecode oldukça yoğun olabilir, dolayısıyla daha da küçük yapılabilir gibi görünüyor
Bunu söylemem Android tabanlı bu projeyi küçümsemek için değil. Zaten en küçük Flappy Bird klonunu yaptığını da iddia etmiyor
[0] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy/...
[1] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy
[2] https://www.youtube.com/watch?v=m839Vg_qXzM
Kafamda bunun çok daha aşağılara inebilmesi gerekirmiş gibi geliyor ve 10KB bile belirsiz de olsa gerçekçi duyuluyor