4 pontos por GN⁺ 2024-09-23 | 1 comentários | Compartilhar no WhatsApp
  • Este projeto tem como objetivo implementar um clone de Flappy Bird para Android em C, reduzindo o tamanho do APK para menos de 100 KB
  • Depois de conhecer o rawdrawandroid em 2021, o autor quis criar um jogo com APK pequeno, e em setembro de 2024 ver um Flappy Bird em C# no Discord do Raylib serviu de gatilho para tentar uma implementação em C
  • A implementação empacota no APK uma biblioteca nativa feita em C e combina OpenGL ES 2, shaders e Android Native Activity
  • O som é comprimido em MP3 e reproduzido com OpenSLES, enquanto a decodificação de PNG usa upng
  • A compilação oferece suporte a Visual Studio Code no Windows e Makefile no Linux/macOS, e deixa explícito que os direitos do jogo e dos recursos pertencem à DotGEARS

Objetivo e contexto do projeto

  • Flappy Bird in C é um projeto para escrever um clone de Flappy Bird em C que rode no Android e manter o tamanho do APK em menos de 100 KB
  • O ponto de partida foi o rawdrawandroid, conhecido em 2021, e o objetivo era criar um jogo pequeno em tamanho de APK, mas ainda compreensível e interessante
  • Como Flappy Bird já foi portado para várias linguagens, ele acabou sendo uma escolha natural para implementar um clone

Tentativas anteriores e problemas

  • Em 2021, o autor estudou Raylib, e a primeira tentativa de fazer o jogo em C++ usando ImGui falhou
  • Na época, havia vários problemas
    • O APK tinha cerca de 1 MB
    • O jogo travava
    • O APK incluía apenas a biblioteca armeabi-v7a
    • Pelos requisitos do Google em 2022, era necessário incluir a biblioteca arm64-v8a

O que motivou a nova tentativa em 2024

  • Depois de ver um Flappy Bird em C# no canal do Discord do Raylib em setembro de 2024, o autor começou a tentar implementar Flappy Bird para Android em C e deixar o APK abaixo de 100 KB
  • O objetivo parecia irrealista, mas o interesse competitivo virou a motivação para a implementação

Como foi implementado

  • O começo foi compilar um Hello World escrito em C e empacotar essa biblioteca em um APK
  • O som é comprimido em formato MP3 e reproduzido com OpenSLES
  • Para decodificar arquivos PNG, foi escolhido o upng
  • Os gráficos e a integração com Android usam em conjunto OpenGL ES 2, shaders e Android Native Activity

Como compilar

  • No Windows, o ambiente de referência é o Visual Studio Code
    • Criar .env a partir de .env.example
    • Executar build.bat
  • No Linux e no macOS, é possível compilar com o Makefile fornecido
    • É necessário instalar as Android command-line tools
    • Configurar as variáveis de ambiente no arquivo .env na raiz do projeto
    • Executar cd FlappyBird e depois make
  • Para passos mais detalhados de compilação, a orientação é consultar BUILDING.md
  • O APK assinado é gerado em FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk

Direitos autorais e projetos de referência

  • O autor do projeto não reivindica direitos autorais e declara que os direitos do jogo e dos recursos pertencem à DotGEARS
  • Os projetos que serviram de inspiração foram os seguintes

1 comentários

 
GN⁺ 2024-09-23
Comentários do Hacker News
  • Seria ótimo se a app store tivesse um filtro para ver apenas apps com menos de 10 MB
    Os apps mais rápidos e com menos anúncios e microtransações geralmente são os menores
    É bem mais provável que eu fique satisfeito baixando um app de termômetro de 3 MB do que um de 150 MB

    • Antigamente havia um desenvolvedor que publicava apps minúsculos na Play Store, tipo lanterna, sudoku e calendário, com tamanhos de um único dígito em KB, mas não consigo mais encontrá-lo
      Todos eles eram realmente pequenos, com menos de 200 KB
    • Isso me lembra um dos motivos pelos quais parei de desenvolver apps mobile
      Recrutadores muitas vezes exigiam resultados para mostrar como se fosse um portfólio artístico, até de apps que já nem existiam mais ou cujos servidores tinham saído do ar
      Um critério ainda mais arbitrário era querer saber se você já tinha feito algum app grande, e se você usasse várias técnicas de otimização que demonstrassem competência e entregasse um pacote de 8–12 MB, isso era interpretado como sinal de que o app, o serviço e a base de usuários eram pequenos
      Na prática, isso não tinha relação nenhuma com o fato de um app ter centenas de milhões de downloads e usuários, e nesta área existe um incentivo enorme para criar apps inchados
    • Ainda acho curioso como os apps Android muitas vezes são bem menores
      Por exemplo, tive que procurar 9 vezes, incluindo apps com anúncios, para achar um app de termômetro com mais de 7 MB
      Trabalhei por anos nas duas plataformas, mas não sei exatamente o motivo; meu palpite é que no Android há uma tradição bem mais forte de arte vetorial do que de bitmaps, e que as bibliotecas Swift, por causa da estabilidade de ABI, precisaram por anos ser compiladas junto com o app até que passassem a usar linkedição dinâmica do lado do sistema operacional
    • Para mim, o sinal de alerta é que os apps são todos gratuitos
      Eu queria poder filtrar por apps pagos, sem anúncios e, às vezes, sem compras no app
    • A Aurora Store pelo menos permite filtrar por pago ou não, compras no app e presença de anúncios
  • Um pouco de lado do tema, mas certa vez escrevi uma revisão de literatura sobre por que as pessoas jogavam Flappy Bird
    Na época eu era pós-graduando em estudos de jogos; no fim não segui carreira acadêmica, mas compartilho por diversão
    Para quem tiver curiosidade, está aqui [1]
    [1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf

    • Sempre senti que havia algo interessante, que merecia estudo mais aprofundado, por trás da notória curva de dificuldade de Flappy Bird
      Por um lado, o jogo em si não tem progressão real nem aumento de dificuldade. Não importa se sua pontuação atual é 0, 10 ou 100, a dificuldade continua a mesma
      Mas cada novo recorde passa a ser um novo pico a ser superado pelo jogador. O primeiro — e talvez o mais irritante — é fazer 1 ponto; para chegar a pontuações de dois dígitos, é preciso dominar o controle básico com sua física e timing precisos, além de aprender a lidar com várias situações
      O obstáculo para chegar a três dígitos ou mais parece quase totalmente autoimposto, e o medo e a tensão ao se aproximar do próprio recorde são o maior obstáculo para superá-lo
      Depois que você ultrapassa esse recorde uma vez, o tremor nas mãos magicamente desaparece na próxima vez que se aproxima dele, mas volta a surgir quando você chega perto de um novo recorde
      O conceito básico de gameplay é enganosamente simples, mas há muitas camadas para quem quiser examiná-lo
    • “Supõe-se que o condicionamento seja reforçado por vários vieses cognitivos que enganam os jogadores a esperar felicidade, isto é, a via do liking, quando na prática estão recebendo frustração. À medida que o condicionamento se repete, os jogadores passam a ser motivados a interagir com o jogo em um nível quase instintivo. Consideramos que essa estimulação da via do wanting pode levar os jogadores a interagir sem realmente gostar do jogo e sem sequer saber por que o jogam. De fato, isso sugere a necessidade de traçar mais um paralelo entre o vício em drogas e o comportamento lúdico em que o liking quase não se manifesta”
    • Nesse contexto, é muito provável que você já tenha visto isto, mas ainda assim preciso apresentar QWOP para os 10 mil sortudos
      https://www.foddy.net/Athletics.html
    • Como especialista em Flappy Bird, eu diria que é porque as pessoas gostam de aproximação polinomial
  • Tem menos de 4 mil linhas
    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

    • Um aluno meu recebeu uma tarefa de fazer um jogo com SFML e escreveu uma cópia de Flappy Bird em algumas centenas de linhas
      Não é um programa tão complexo assim, então sinceramente acho que até 4 mil linhas já é demais
    • É uma pena que 4 mil linhas de código, quando compiladas, virem um binário com mais de 100 KB
  • Em 2020 eu fiz e publiquei algo parecido em Nim, embora os gráficos fossem menos bonitos
    A diferença é que fui mais a fundo e cheguei a escrever de fato um montador para bytecode Dalvik e arquivos .apk
    https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
    Infelizmente, o código do repositório quebrou com o tempo, e às vezes penso em tentar revivê-lo algum dia
    Às vezes me vêm à cabeça apps que poderiam ser feitos com facilidade se isso estivesse um pouco mais lapidado

  • Muito legal
    É bom ver um app Android com menos de 1 MB rodando em qualquer lugar, até em um HTC antigo

    • Também seria bom ter alguma avaliação de quanto ganho de desempenho isso traz
  • Eu achava que era necessário código de ligação em Java para criar um APK Android, então foi legal ver este projeto
    0 arquivos Java é excelente
    Também vale a pena dar uma olhada no projeto rawandroid que outras pessoas mencionaram
    https://github.com/cnlohr/rawdrawandroid/tree/master

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

    • Mas aquilo foi feito para rodar em exatamente uma especificação de hardware, praticamente sem sistema operacional
      Este clone de Flappy Bird roda em incontáveis dispositivos com combinações variadas de hardware e software
  • Como cabe em um disquete de 3,5 polegadas, perderam a chance de chamar de Floppy Bird

    • Também pensei nisso, mas infelizmente alguns clones já ficaram com esse nome
      O mais visível é uma versão com mudança simples de skin, usando um ícone de disquete no lugar do pássaro
    • Na Argentina, todo mundo chama de ‘floppy beard’
      Claro, ‘angry birds’ vira ‘ongry beards’
  • Será que essa técnica de fazer aplicações em C para Android com rawdrawandroid poderia ser aplicada a outros frameworks em C, como raylib?
    E será que daria para usar esse sistema de desenvolvimento via Termux e criar, sobre o Android, um ambiente de desenvolvimento em C para o próprio Android?

    • Sim. raylib oferece suporte a Android
      Tenho um script de build meio inacabado que uso no meu projeto com raylib
      Obviamente a parte de assinatura precisa ser feita de forma mais adequada, talvez você também queira gerar builds para alvos além de aarch64, e o SDK pode não estar instalado em /home/denis
      Também não tenho certeza se adicionar o arquivo .so ao apk é a forma preferida pelo Android moderno, mas ainda funciona
      https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
  • Se for “para Android”, isso significa que dá para usar Java, e como bytecode pode ser bem compacto, talvez desse para fazer algo ainda menor