4 puntos por GN⁺ 2024-09-23 | 1 comentarios | Compartir por WhatsApp
  • Este proyecto busca implementar un clon de Flappy Bird para Android en C y reducir el tamaño del APK a menos de 100 KB
  • Tras descubrir rawdrawandroid en 2021, su autor quiso crear un juego con un APK pequeño, y en septiembre de 2024 ver un Flappy Bird en C# en el Discord de Raylib fue el detonante para intentar una implementación en C
  • La implementación empaqueta en el APK una biblioteca nativa escrita en C y combina OpenGL ES 2, shaders y Android Native Activity
  • El sonido se comprime en MP3 y se reproduce con OpenSLES, mientras que para decodificar PNG se usa upng
  • Soporta compilación con Visual Studio Code en Windows y con Makefile en Linux/macOS, y aclara que los derechos del juego y los recursos pertenecen a DotGEARS

Objetivo y contexto del proyecto

  • Flappy Bird in C es un proyecto que busca escribir un clon de Flappy Bird en C para Android y mantener el tamaño del APK en menos de 100 KB
  • El punto de partida fue rawdrawandroid, que conoció en 2021, y el objetivo era crear un juego que fuera comprensible e interesante mientras minimizaba al máximo el tamaño del APK
  • Como Flappy Bird ya ha sido porteado a muchos lenguajes, se eligió de forma natural como objetivo para hacer un clon

Intentos anteriores y problemas

  • En 2021 estudió Raylib y su primer intento de crear un juego en C++ usando ImGui fracasó
  • En ese momento hubo varios problemas
    • El APK pesaba alrededor de 1 MB
    • El juego se cerraba inesperadamente
    • El APK solo incluía la biblioteca armeabi-v7a
    • Según los requisitos de Google de 2022, era necesario incluir también la biblioteca arm64-v8a

Qué motivó el nuevo intento en 2024

  • En septiembre de 2024, después de ver un Flappy Bird en C# en el canal de Discord de Raylib, comenzó el intento de implementar Flappy Bird para Android en C y dejar el APK por debajo de 100 KB
  • Aunque la meta parecía poco realista, el reto competitivo fue lo que motivó la implementación

Cómo está hecho

  • Todo comenzó compilando un Hello World escrito en C y empaquetando esa biblioteca dentro de un APK
  • El sonido se comprime en formato MP3 y se reproduce usando OpenSLES
  • Para decodificar archivos PNG se eligió upng
  • Los gráficos y la integración con Android usan en conjunto OpenGL ES 2, shaders y Android Native Activity

Cómo compilarlo

  • En Windows se toma como base el entorno de Visual Studio Code
    • Crear .env a partir de .env.example
    • Ejecutar build.bat
  • En Linux y macOS se puede compilar con el Makefile incluido
    • Es necesario instalar Android command-line tools
    • Configurar variables de entorno en el archivo .env de la raíz del proyecto
    • Ejecutar cd FlappyBird y luego make
  • Para instrucciones más detalladas de compilación, se indica consultar BUILDING.md
  • El APK firmado se genera en FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk

Derechos y proyectos de referencia

  • El autor del proyecto aclara que no reclama derechos de autor y que los derechos del juego y los recursos pertenecen a DotGEARS
  • Los proyectos que sirvieron de inspiración son los siguientes

1 comentarios

 
GN⁺ 2024-09-23
Comentarios de Hacker News
  • Me gustaría que las tiendas de apps tuvieran un filtro para ver solo apps de menos de 10 MB
    Las apps más rápidas y con menos anuncios y micropagos suelen ser las pequeñas
    Es mucho más probable que quedes satisfecho descargando una app de termómetro de 3 MB que una de 150 MB

    • Antes había un editor en Play Store que subía apps diminutas, de apenas unos KB de una sola cifra, como linterna, sudoku y calendario, pero ahora no lo encuentro
      Todas esas apps eran realmente pequeñas, de menos de 200 KB
    • Me recuerda una de las razones por las que dejé el desarrollo de apps móviles
      Los reclutadores muchas veces pedían resultados para mostrar, como si fueran un portafolio artístico, incluso de apps que ya no existían o cuyos servidores de producción estaban caídos
      Un criterio aún más arbitrario era verificar si habías trabajado en alguna app grande, y si usando muchas técnicas de optimización que parecían demostrar capacidad lograbas un paquete de 8 a 12 MB, lo tomaban como señal de que la app, el servicio o la base de usuarios eran pequeños
      En realidad, aunque tuviera cientos de millones de descargas y usuarios, eso no tenía nada que ver con ese criterio, y en este campo hay un incentivo enorme para crear apps infladas
    • Todavía me sorprende que las apps de Android muchas veces sean mucho más pequeñas
      Por ejemplo, incluso incluyendo anuncios, tuve que buscar unas 9 veces para encontrar una app de termómetro de más de 7 MB
      Trabajé varios años en ambas plataformas y no sé exactamente por qué; si tuviera que adivinar, quizá sea porque Android tiene una tradición mucho más fuerte de arte vectorial que de bitmaps, y porque las bibliotecas de Swift, gracias a la estabilidad de ABI, durante años tuvieron que compilarse junto con la app hasta que se empezó a usar el enlazado dinámico del lado del sistema operativo
    • Para mí, una señal de alerta es que todas las apps sean gratis
      Me gustaría poder filtrar por apps de pago, sin anuncios y, a veces, sin compras dentro de la app
    • Aurora Store al menos permite filtrar por si es de pago, si tiene compras dentro de la app y si incluye anuncios
  • Es un poco tangencial, pero hace tiempo escribí una revisión bibliográfica sobre por qué la gente juega Flappy Bird
    En ese momento era estudiante de posgrado en investigación de juegos y al final no seguí en la academia, pero lo comparto por diversión
    Está aquí para quien tenga curiosidad [1]
    [1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf

    • Siempre sentí que detrás de la infame curva de dificultad de Flappy Bird había algo interesante que valía la pena investigar más a fondo
      Por un lado, el juego en sí no tiene progreso real ni aumento de dificultad. La dificultad es la misma sin importar si tu puntaje actual es 0, 10 o 100
      Pero cada nuevo récord se convierte en una nueva cima que el jugador debe superar. La primera, y quizá la más frustrante, es conseguir 1 punto; para llegar a puntajes de dos cifras, básicamente hay que dominar los controles centrales, incluida la física y el timing precisos, y aprender a manejar distintas situaciones
      Los obstáculos para llegar a tres cifras o más parecen casi autogenerados, y el miedo y la tensión al acercarse al récord personal son el mayor obstáculo para superarlo
      Una vez que superas ese récord, el temblor de manos desaparece mágicamente la próxima vez que te acercas a él, pero vuelve a aparecer cuando te acercas a un nuevo récord
      El concepto básico de gameplay es engañosamente simple, pero para quien quiera analizarlo tiene muchas capas por desentrañar
    • “Se supone que el condicionamiento se refuerza mediante varios sesgos cognitivos que engañan al jugador para que espere euforia, es decir, la vía del liking, aunque en realidad obtiene frustración. Cuando el condicionamiento se repite, el jugador queda sincronizado para interactuar con el juego a un nivel casi instintivo. Creemos que esta estimulación de la vía del wanting puede hacer que el jugador interactúe no solo sin que el juego realmente le guste, sino incluso sin saber por qué lo juega. De hecho, esto sugiere que hace falta trazar otro paralelismo entre la adicción a las drogas y las conductas de juego en las que el liking apenas se manifiesta”
    • Con ese contexto, es muy probable que ya lo hayas visto, pero aun así, para los 10 mil afortunados, tengo que presentar QWOP
      https://www.foddy.net/Athletics.html
    • Como experto en Flappy Bird, diría que es porque a la gente le gustan las aproximaciones polinómicas
  • Son menos de 4 mil líneas
    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

    • A un estudiante mío le dieron una tarea de hacer un juego con SFML, y escribió un clon de Flappy Bird en unos pocos cientos de líneas
      No es un programa tan complejo, así que sinceramente creo que incluso 4 mil líneas son demasiadas
    • Es una lástima que 4 mil líneas de código, al compilarse, se conviertan en un binario de más de 100 KB
  • En 2020 hice y publiqué algo similar en Nim, aunque los gráficos eran menos bonitos
    La diferencia es que fui más a fondo y de hecho escribí hasta un ensamblador para bytecode de Dalvik y archivos .apk
    https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
    Lamentablemente, el código del repositorio se rompió con el tiempo, y a veces pienso en revivirlo algún día
    A veces se me ocurren apps que podría hacer fácilmente si aquello estuviera un poco más pulido

  • Realmente genial
    Es bueno ver una app de Android de menos de 1 MB que corre en todas partes, incluso en un HTC viejo

    • También estaría bueno tener una evaluación de cuánto mejora la velocidad
  • Pensaba que para crear un APK de Android hacía falta código de enlace en Java, así que me alegra ver este proyecto
    0 archivos Java, excelente
    También vale la pena ver el proyecto rawandroid que mencionaron otros
    https://github.com/cnlohr/rawdrawandroid/tree/master

  • Super Mario Bros ocupaba apenas 40 KB
    https://news.ycombinator.com/item?id=21213421

    • Eso también fue hecho para funcionar en exactamente una especificación de hardware y, en la práctica, sin sistema operativo
      Este clon de Flappy Bird corre en incontables dispositivos con configuraciones de hardware y software muy variadas
  • Perdieron la oportunidad de llamarlo Floppy Bird, ya que cabe en un disquete de 3,5 pulgadas

    • Yo también pensé en eso, pero lamentablemente varios clones ya se quedaron con ese nombre
      El más llamativo es una simple versión con cambio de skin que usa un ícono de disquete en lugar de un pájaro
    • En Argentina todos le dicen “floppy beard”
      Por supuesto, “angry birds” es “ongry beards”
  • ¿Esta técnica de crear aplicaciones en C para Android con rawdrawandroid podría aplicarse también a otros frameworks en C, como raylib?
    ¿Y se podría usar este sistema de desarrollo a través de Termux para montar un entorno de desarrollo en C para Android sobre Android?

    • Sí se puede. raylib soporta Android
      Tengo un script de compilación algo incompleto que uso para mi proyecto con raylib
      Obviamente habría que manejar mejor la firma, quizá quieras compilar para objetivos además de aarch64, y puede que el SDK tampoco esté instalado en /home/denis
      Además, no estoy seguro de que agregar el archivo .so al apk de esta forma sea el método preferido por Android moderno, pero todavía funciona
      https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
  • Si es “para Android”, eso significa que se puede usar Java, y el bytecode puede ser muy compacto, así que parece que podría hacerse aún más pequeño