4 points par GN⁺ 2024-09-23 | 1 commentaires | Partager sur WhatsApp
  • Ce projet vise à implémenter un clone de Flappy Bird pour Android en C tout en réduisant la taille de l’APK à moins de 100 Ko
  • Après avoir découvert rawdrawandroid en 2021, l’auteur voulait créer un jeu avec un petit APK, et le fait d’avoir vu un Flappy Bird en C# sur le Discord de Raylib en septembre 2024 a déclenché la tentative d’une implémentation en C
  • L’implémentation consiste à empaqueter dans l’APK une bibliothèque native écrite en C, en combinant OpenGL ES 2, des shaders et Android Native Activity
  • Le son est compressé en MP3 et lu avec OpenSLES, tandis que upng est utilisé pour le décodage PNG
  • La compilation prend en charge Visual Studio Code sous Windows et un Makefile sous Linux/macOS, et il est précisé que les droits sur le jeu et les ressources appartiennent à DotGEARS

Objectif et contexte du projet

  • Flappy Bird in C est un projet qui vise à écrire un clone de Flappy Bird en C pour Android tout en maintenant la taille de l’APK à moins de 100 Ko
  • Le point de départ a été rawdrawandroid, découvert en 2021, avec pour objectif de créer un jeu à la fois compréhensible et intéressant tout en minimisant la taille de l’APK
  • Comme Flappy Bird a déjà été porté dans de nombreux langages, il s’est naturellement imposé comme cible pour un clone

Tentatives précédentes et problèmes

  • En 2021, l’auteur étudiait Raylib et une première tentative de créer le jeu en C++ avec ImGui a échoué
  • Les problèmes rencontrés à l’époque étaient multiples
    • La taille de l’APK était d’environ 1 Mo
    • Le jeu plantait
    • L’APK n’incluait qu’une bibliothèque armeabi-v7a
    • Les exigences de Google pour 2022 imposaient aussi l’inclusion d’une bibliothèque arm64-v8a

Ce qui a motivé la reprise en 2024

  • Après avoir vu un Flappy Bird en C# sur le canal Discord de Raylib en septembre 2024, l’auteur a entrepris d’implémenter Flappy Bird pour Android en C et de faire passer l’APK sous les 100 Ko
  • L’objectif paraissait irréaliste, mais l’intérêt du défi a servi de moteur à l’implémentation

Méthode d’implémentation

  • Le point de départ a consisté à compiler un Hello World écrit en C puis à empaqueter la bibliothèque obtenue dans un APK
  • Le son est compressé au format MP3 et lu à l’aide d’OpenSLES
  • Pour le décodage des fichiers PNG, le choix s’est porté sur upng
  • La partie graphique et l’intégration Android s’appuient conjointement sur OpenGL ES 2, des shaders et Android Native Activity

Méthode de build

  • Sous Windows, l’environnement de référence est Visual Studio Code
    • Créer .env à partir de .env.example
    • Exécuter build.bat
  • Sous Linux et macOS, la compilation est possible avec le Makefile fourni
    • L’installation des Android command-line tools est nécessaire
    • Définir les variables d’environnement dans le fichier .env à la racine du projet
    • Après cd FlappyBird, exécuter make
  • Pour une procédure de build plus détaillée, il est indiqué de consulter BUILDING.md
  • L’APK signé est généré dans FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk

Droits d’auteur et projets de référence

  • L’auteur du projet ne revendique aucun droit d’auteur et précise que les droits sur le jeu et les ressources appartiennent à DotGEARS
  • Les projets ayant servi d’inspiration sont les suivants

1 commentaires

 
GN⁺ 2024-09-23
Avis de Hacker News
  • J’aimerais qu’il y ait dans les app stores un filtre n’afficher que les apps de moins de 10 Mo
    Les apps les plus rapides, avec le moins de publicité et de microtransactions, sont généralement les petites apps
    On a bien plus de chances d’être satisfait en téléchargeant une app de thermomètre de 3 Mo qu’une app de thermomètre de 150 Mo

    • Il y avait autrefois sur le Play Store un éditeur qui publiait de toutes petites apps, de l’ordre de quelques Ko, comme lampe torche, sudoku, calendrier, mais je ne le retrouve plus aujourd’hui
      Ces apps étaient vraiment minuscules, toutes sous les 200 Ko
    • Ça me rappelle l’une des raisons pour lesquelles j’ai arrêté le développement d’apps mobiles
      Les recruteurs demandaient souvent des réalisations à montrer, comme un portfolio artistique, même pour des apps qui n’existaient plus ou dont les serveurs de production étaient hors ligne
      Le critère encore plus arbitraire consistait à vérifier si l’on avait travaillé sur une grosse app ; si l’on utilisait beaucoup de techniques d’optimisation qui semblaient démontrer de la compétence pour obtenir un paquet de 8 à 12 Mo, c’était interprété comme le signe que l’app, le service ou la base d’utilisateurs étaient petits
      En réalité, même avec des centaines de millions de téléchargements et d’utilisateurs, cela n’avait aucun rapport avec ce critère, et dans ce domaine les incitations à produire des apps boursouflées sont énormes
    • Je trouve toujours étonnant que les apps Android soient souvent beaucoup plus petites
      Par exemple, il m’a fallu chercher jusqu’à neuf fois, pubs comprises, pour trouver une app de thermomètre dépassant 7 Mo
      J’ai travaillé plusieurs années sur les deux plateformes, mais je ne connais pas la raison exacte ; à vue de nez, c’est peut-être parce qu’Android a une tradition beaucoup plus forte de vector art que de bitmaps, et parce que les bibliothèques Swift, grâce à la stabilité de l’ABI, ont dû être compilées avec les apps pendant plusieurs années avant d’utiliser la liaison dynamique côté système d’exploitation
    • Pour moi, le signal d’alerte, c’est que toutes ces apps sont gratuites
      J’aimerais pouvoir filtrer les apps payantes, sans publicité, et parfois même sans achats intégrés
    • Aurora Store permet au moins de filtrer selon le caractère payant, les achats intégrés et la présence de publicités
  • C’est un peu une digression, mais j’ai écrit autrefois une revue de littérature sur les raisons pour lesquelles les gens jouaient à Flappy Bird
    J’étais alors doctorant en études du jeu vidéo ; je n’ai finalement pas poursuivi dans le monde universitaire, mais je partage ça pour le plaisir
    Pour les curieux, c’est ici [1]
    [1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf

    • J’ai toujours eu le sentiment qu’il y avait, derrière la tristement célèbre courbe de difficulté de Flappy Bird, quelque chose d’intéressant qui mériterait d’être étudié plus en profondeur
      D’un côté, le jeu lui-même n’a pas de véritable progression ni d’augmentation de la difficulté. Que le score actuel soit 0, 10 ou 100, la difficulté reste la même
      Mais chaque nouveau record devient un nouveau sommet à franchir pour le joueur. Le premier, et peut-être le plus agaçant, consiste à marquer 1 point ; pour atteindre un score à deux chiffres, il faut en gros maîtriser les contrôles essentiels, avec la physique et le timing exacts, et apprendre à gérer plusieurs situations
      Les obstacles qui empêchent d’atteindre trois chiffres ou plus semblent presque auto-générés : la peur et la tension ressenties à l’approche de son record personnel deviennent le plus grand obstacle à son dépassement
      Une fois ce record battu, les tremblements disparaissent comme par magie la prochaine fois qu’on s’en approche, mais réapparaissent à l’approche d’un nouveau record
      Le concept de gameplay de base est d’une simplicité trompeuse, mais il comporte beaucoup de couches à décortiquer pour qui veut s’y pencher
    • « On suppose que le conditionnement est renforcé par divers biais cognitifs qui amènent le joueur à anticiper une sensation de bonheur, c’est-à-dire la voie du liking, alors qu’il obtient en réalité de la frustration. À mesure que le conditionnement se répète, le joueur se synchronise avec le jeu à un niveau presque instinctif. Nous pensons que cette stimulation de la voie du wanting peut pousser le joueur à interagir sans réellement aimer le jeu, ni même savoir pourquoi il y joue. En pratique, cela suggère qu’il faut établir un autre parallèle avec l’addiction aux drogues et les comportements de jeu dans lesquels le liking se manifeste à peine »
    • Vu ce contexte, il est très probable que tu l’aies déjà vu, mais pour les 10 000 chanceux du jour, je dois quand même présenter QWOP
      https://www.foddy.net/Athletics.html
    • En tant qu’expert de Flappy Bird, je dirais que c’est parce que les gens aiment les approximations polynomiales
  • Ça fait moins de 4 000 lignes
    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

    • Mon étudiant avait un devoir consistant à créer un jeu avec SFML, et il a écrit un clone de Flappy Bird en quelques centaines de lignes
      Ce n’est pas un programme si complexe que ça, donc honnêtement, je trouve que 4 000 lignes, c’est déjà trop
    • C’est dommage que 4 000 lignes de code compilées donnent un binaire de plus de 100 Ko
  • En 2020, j’ai créé et publié quelque chose de similaire en Nim, même si les graphismes étaient moins jolis
    La différence, c’est que je suis allé plus loin et que j’ai réellement écrit un assembleur pour le bytecode Dalvik et les fichiers .apk
    https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
    Le code du dépôt s’est malheureusement cassé avec le temps, et il m’arrive de penser à le ressusciter un jour
    Il y a des moments où une app simple que je pourrais faire me vient à l’esprit, si seulement tout cela était un peu plus peaufiné

  • Vraiment excellent
    C’est agréable de voir une app Android de moins de 1 Mo tourner partout, même sur un vieux HTC

    • Ce serait bien d’avoir aussi une évaluation du gain de vitesse
  • Je pensais qu’il fallait du code de liaison Java pour créer un APK Android, donc ce projet est une bonne surprise
    0 fichier Java, c’est excellent
    Le projet rawandroid mentionné par d’autres vaut aussi le coup d’œil
    https://github.com/cnlohr/rawdrawandroid/tree/master

  • Super Mario Bros ne faisait que 40 Ko
    https://news.ycombinator.com/item?id=21213421

    • C’était aussi conçu pour fonctionner sur une seule spécification matérielle précise, en pratique sans système d’exploitation
      Ce clone de Flappy Bird tourne sur un nombre incalculable d’appareils aux configurations matérielles et logicielles très diverses
  • Comme il tient sur une disquette 3,5 pouces, ils ont raté l’occasion de l’appeler Floppy Bird

    • J’y ai pensé aussi, mais malheureusement quelques clones ont déjà pris ce nom
      Le plus visible est une simple version reskinnée qui utilise une icône de disquette à la place de l’oiseau
    • En Argentine, tout le monde l’appelle « floppy beard »
      Et bien sûr, « angry birds » devient « ongry beards »
  • Cette technique de création d’applications C pour Android avec rawdrawandroid pourrait-elle s’appliquer à d’autres frameworks C comme raylib ?
    Et pourrait-on utiliser ce système de développement via Termux pour créer, sur Android, un environnement de développement C ciblant Android ?

    • Oui. raylib prend en charge Android
      J’ai un script de build un peu inachevé que j’utilise pour mes projets raylib
      Évidemment, il faudrait gérer la signature plus proprement, vouloir éventuellement compiler pour des cibles autres que aarch64, et il se peut aussi que le SDK ne soit pas installé dans /home/denis
      Je ne suis pas non plus certain que la façon d’ajouter le fichier .so à l’apk soit celle que privilégie Android moderne, mais cela fonctionne encore
      https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
  • « Pour Android » signifie qu’on peut utiliser Java, et comme le bytecode peut être très compact, on devrait pouvoir faire encore plus petit