4 puan yazan GN⁺ 2024-09-23 | 1 yorum | WhatsApp'ta paylaş
  • 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.example dosyasından .env oluşturun
    • build.bat dosyasını çalıştırın
  • Linux ve macOS’ta sağlanan Makefile ile derlenebilir
    • Android command-line tools kurulumu gerekir
    • Proje kökündeki .env dosyasında ortam değişkenlerini ayarlayın
    • cd FlappyBird ardından make komutunu çalıştırın
  • Daha ayrıntılı derleme adımları için BUILDING.md dosyasına bakılması öneriliyor
  • İmzalı APK, FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk konumunda 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

 
GN⁺ 2024-09-23
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

    • Eskiden Play Store’a tek haneli KB boyutlarında el feneri, sudoku, takvim gibi çok küçük uygulamalar yükleyen bir geliştirici vardı, ama artık bulamıyorum
      O uygulamaların hepsi 200 KB’ın altındaydı; gerçekten çok küçüktüler
    • Mobil uygulama geliştirmeyi bırakma nedenlerimden biri aklıma geldi
      İş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
    • Android uygulamalarının çoğu zaman çok daha küçük olması hâlâ bana ilginç geliyor
      Ö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ı
    • Benim için kırmızı bayrak, uygulamaların hepsinin ücretsiz olması
      Keşke ücretli, reklamsız ve bazen uygulama içi satın alma da olmayan uygulamalar için filtreleme yapılabilse
    • Aurora Store en azından ücretli olup olmama, uygulama içi satın alma, reklam içerip içermeme açısından filtreleme yapabiliyor
  • 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

    • Flappy Bird’ün kötü şöhretli zorluk eğrisinin arkasında daha derin incelenmeye değer ilginç bir şeyler olduğunu hep hissettim
      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
    • “Koşullanmanın, oyuncunun gerçekte hayal kırıklığı yaşasa da mutluluk, yani liking yolunu beklemesine neden olan çeşitli bilişsel önyargılar üzerinden pekiştirildiği tahmin edilmektedir. Koşullanma tekrarlandıkça oyuncu, oyunla neredeyse içgüdüsel bir düzeyde etkileşime girmeye motive olur. Biz, wanting yolunun bu şekilde uyarılmasının, oyuncunun oyunu gerçekten sevmese ve hatta neden oynadığını bilmese bile etkileşime girmesine yol açabileceğini düşünüyoruz. Nitekim bu, uyuşturucu bağımlılığı ile liking’in neredeyse hiç görünmediği oyun davranışları arasında bir başka paralellik kurulması gerektiğini düşündürmektedir”
    • Bu geçmişle muhtemelen görmüş olma ihtimalin çok yüksek, ama yine de şanslı 10 bin için QWOP’u tanıtmak gerekir
      https://www.foddy.net/Athletics.html
    • Bir Flappy Bird uzmanı olarak söyleyeyim: çünkü insanlar polinom yaklaşımını seviyor
  • 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

    • Bir öğrencim SFML ile oyun yapma ödevi aldı ve Flappy Bird klonunu birkaç yüz satır civarında yazdı
      O kadar karmaşık bir program değil; açıkçası 4 bin satır bile bana fazla geliyor
    • 4 bin satır kod derlenince 100 KB’ı aşan bir binary çıkması üzücü
  • 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

    • Hız kazanımının ne kadar olduğuna dair bir değerlendirme de olsa iyi olurdu
  • 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

  • Super Mario Bros yalnızca 40KB idi
    https://news.ycombinator.com/item?id=21213421

    • Ama o tam olarak tek bir donanım özelliği için, fiilen işletim sistemi olmadan çalışacak şekilde yapılmıştı
      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ış

    • Ben de aynısını düşündüm ama ne yazık ki bazı klonlar bu adı çoktan almıştı
      En göze çarpanı, kuş yerine disket simgesi kullanan basit bir kaplama değiştirilmiş sürüm
    • Arjantin'de herkes buna ‘floppy beard’ diyor
      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?

    • Mümkün. raylib Android'i destekliyor
      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