4 puntos por GN⁺ 2024-09-23 | 1 comentarios | Compartir por WhatsApp
  • Flappy Bird, solo C, sin Java/Kotlin, APK ligero (armeabi-v7a +arm64-v8a) < 100 kilobytes

Historia:

  • En 2021 descubrí el repositorio rawdrawandroid
  • Eso me motivó a crear un juego simple con un APK lo más pequeño posible
  • Decidí hacer un clon del juego Flappy Bird
  • El primer intento fue con C++ e ImGui, pero fracasó
    • El APK pesaba alrededor de 1 megabyte
    • Existía la posibilidad de que el juego fallara
    • El APK solo incluía la biblioteca armeabi-v7a
    • La estructura del proyecto era compleja y desordenada

Motivación:

  • El 14 de septiembre de 2024 vi en el canal de Discord de Raylib a alguien que hizo Flappy Bird en C#
  • Quise asumir el reto de llevar el tamaño de un APK para Android hecho en C a menos de 100 kilobytes
  • Hoy en día, cuando hay APK que llegan a 500 megabytes, mantenerlo por debajo de 100 kilobytes es algo muy difícil
  • Al final lo logré, pero no fue fácil

Implementación:

  • Al principio compilé un Hello World en C, empaqueté la biblioteca en un APK y la transferí al dispositivo por USB
  • Empecé a explorar los recursos del juego
  • Al principio usé sonidos en formato ogg, pero surgieron problemas; luego cambié al formato mp3 y lo comprimí
  • Intenté reproducir el sonido con BASS, pero era demasiado pesado, así que estudié OpenSLES para leer el formato MP3 sin problemas
  • Usé imágenes png y encontré upng, más ligero que stb_image, para resolver problemas de decodificación
  • Renderizado con OpenGL ES 2 + shaders, reproducción de sonido con OpenSLES, decodificación png con upng, uso de Android Native Activity

Compilación:

  • Descargar Visual Studio 2022
    • Abrir Visual Studio Installer
    • Hacer clic en "Edit"
    • Seleccionar desarrollo de aplicaciones clásicas en C++ y desarrollo de aplicaciones móviles en C++
  • Descargar Android Studio (se necesitan apktool, sdk, ndk)
    • Instalar NDK 25.2.9519653 (se puede usar una versión superior)
  • La configuración del proyecto está en "Debug ARM", pero hay que corregir las rutas en build.bat
  • Compilar con CTRL + B

Derechos de autor:

  • No reclamo derechos de autor. Los derechos del juego y de los recursos pertenecen a DotGEARS

Inspiración:

  • rawdrawandroid
  • Flapper
  • Raylib
  • ImGui

Resumen de GN⁺:

  • Este proyecto es un intento desafiante de crear un juego Flappy Bird para Android en lenguaje C
  • Logra implementar el juego manteniendo el APK por debajo de 100 kilobytes
  • Optimiza recursos usando varias tecnologías como OpenGL ES 2, OpenSLES y upng
  • Este proyecto ofrece a los ingenieros de software una visión sobre el desarrollo de juegos eficientes y de tamaño reducido
  • Entre los proyectos con funciones similares están Raylib y rawdrawandroid

1 comentarios

 
GN⁺ 2024-09-23
Comentarios en Hacker News
  • Ojalá hubiera un filtro de "apps de menos de 10 MB" en la tienda de aplicaciones

    • Las apps pequeñas son más rápidas y tienen menos anuncios o micropagos
    • Una app de termómetro de 3 MB se siente más satisfactoria que una app de termómetro de 150 MB
  • Comparten la experiencia de haber escrito una revisión bibliográfica sobre por qué la gente juega Flappy Bird

  • Comparten la experiencia de haber publicado un proyecto similar en Nim en 2020

  • El código tiene menos de 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 pesaba 40 KB

  • Pensaban que se necesitaba algo de pegamento en Java para crear un APK de Android

  • Está buenísimo ver una app de Android de menos de 1 MB

    • Incluso puede correr en un HTC viejo
    • Felicidades
  • Habría estado bien llamarlo "Floppy Bird"

    • Cabría en un disquete de 3.5 pulgadas
  • Es refrescante y agradable ver programas/juegos/apps "hechos con esmero" en lugar de componentes inflados de terceros

  • Se preguntan si la técnica de escribir aplicaciones en C para Android usando rawdrawandroid también podría ser aprovechada por raylib (y otros frameworks en C)

    • Se preguntan si, a través de Termux, se podría usar en Android un entorno de desarrollo en C para Android