4 pontos por GN⁺ 2024-09-23 | 1 comentários | Compartilhar no WhatsApp
  • Flappy Bird, apenas em C, sem Java/Kotlin, APK leve (armeabi-v7a + arm64-v8a) < 100 kilobytes

Histórico:

  • Em 2021, encontrou o repositório rawdrawandroid
  • Surgiu a motivação de criar um jogo simples com o menor tamanho de APK possível
  • Decidiu fazer um clone do jogo Flappy Bird
  • A primeira tentativa foi feita com C++ e ImGui, mas fracassou
    • O APK tinha cerca de 1 megabyte
    • Havia possibilidade de o jogo travar
    • O APK incluía apenas a biblioteca armeabi-v7a
    • A estrutura do projeto era complexa e desorganizada

Motivação:

  • Em 14 de setembro de 2024, viu no canal do Discord do Raylib alguém que fez Flappy Bird em C#
  • Quis desafiar a ideia de criar um APK para Android em C com menos de 100 kilobytes
  • Hoje, quando os APKs chegam a 500 megabytes, manter isso abaixo de 100 kilobytes é algo muito difícil
  • No fim, conseguiu, mas não foi fácil

Implementação:

  • Primeiro compilou um Hello World em C, empacotou a biblioteca em um APK e o transferiu para o dispositivo via USB
  • Começou a explorar os recursos do jogo
  • No início usou sons no formato ogg, mas surgiram problemas; depois mudou para o formato mp3 e o comprimiu
  • Tentou usar o BASS para reproduzir som, mas era pesado; então estudou OpenSLES para ler o formato MP3 sem problemas
  • Usou imagens png e encontrou o upng, mais leve que stb_image, resolvendo problemas de decodificação
  • Renderização com OpenGL ES 2 + shaders, reprodução de som com OpenSLES, decodificação de png com upng e uso de Android Native Activity

Build:

  • Baixar o Visual Studio 2022
    • Abrir o Visual Studio Installer
    • Clicar em "Edit"
    • Selecionar os itens de desenvolvimento de aplicativos clássicos em C++ e desenvolvimento de aplicativos móveis em C++
  • Baixar o Android Studio (apktool, sdk, ndk necessários)
    • Instalar o NDK 25.2.9519653 (versões superiores também podem ser usadas)
  • A configuração do projeto está em "Debug ARM", mas é necessário ajustar os caminhos no build.bat
  • Compilar com CTRL + B

Direitos autorais:

  • Não reivindica direitos autorais. Os direitos do jogo e dos recursos pertencem à DotGEARS

Inspiração:

  • rawdrawandroid
  • Flapper
  • Raylib
  • ImGui

Resumo do GN⁺:

  • Este projeto é uma tentativa desafiadora de criar um jogo Flappy Bird para Android em C
  • Teve sucesso em implementar o jogo mantendo o tamanho do APK abaixo de 100 kilobytes
  • Otimiza os recursos usando várias tecnologias, como OpenGL ES 2, OpenSLES e upng
  • Este projeto oferece aos engenheiros de software insights sobre o desenvolvimento de jogos eficientes e de tamanho reduzido
  • Projetos com funcionalidade semelhante incluem Raylib e rawdrawandroid

1 comentários

 
GN⁺ 2024-09-23
Opiniões no Hacker News
  • Seria ótimo se a app store tivesse um filtro de "apps com menos de 10 MB"

    • Apps pequenos são mais rápidos e têm menos anúncios ou microtransações
    • Um app de termômetro de 3 MB é mais satisfatório do que um app de termômetro de 150 MB
  • Compartilhamento de uma experiência de ter escrito uma revisão bibliográfica sobre por que as pessoas jogam Flappy Bird

  • Compartilhamento de uma experiência de ter publicado um projeto parecido em Nim em 2020

  • O código tem 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 tinha 40 KB

  • Achava que era preciso fazer uma colagem em Java para criar um APK Android

  • É muito legal ver um app Android com menos de 1 MB

    • Roda até em HTC antigos
    • Parabéns
  • Talvez tivesse sido melhor chamar de "Floppy Bird"

    • Caberia em um disquete de 3,5 polegadas
  • É revigorante ver um programa/jogo/app "feito com capricho" em vez de componentes de terceiros já inflados

  • Fica a dúvida se a técnica de usar rawdrawandroid para escrever aplicações em C no Android também poderia ser usada pelo raylib (e outros frameworks em C)

    • Fica a dúvida se é possível usar, via Termux, um ambiente de desenvolvimento em C para Android no próprio Android