8 ms·
Flappy Bird for Android, only C, under 100KB
- freitzzz 2y agoReally cool! I just love seeing Android apps that weight less than a 1MB and run anywhere, even on your old HTC. Congrats!
- mdp2021 2y agoAlso an assessment of speed gains would be nice.
- habibur 2y agoLess than 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
- kgeist 2y agoA student of mine had an assignment to write a game using SFML, they wrote a FlappyBird clone and it was like a few hundred lines of code. It's not a very complex program to write. To be honest, I think 4k is too much :)
- snvzz 2y agoTo be fair, Android itself requires some level of fluff. So does making the game work well in more than one device.
- dario_od 2y agoAre you including SFML loc in that total?
- kvemkon 2y ago3623 total - 1377 upng.c (3rd-party tiny PNG image decoding library) = 2246
- charles_f 2y agogame.c is 800 odd lines. There are some optimizations you could do here and there (e.g load digit sprites in an array to avoid the switch case 1/2/3... stuff). The bulk of the 3000 is fluff that you need because this is C on Android, not SFML.
- londons_explore 2y agoA shame that 4k loc compiles to over 100k of binary size.
- kvemkon 2y agoactually including both architectures: armeabi-v7a + arm64-v8a to check: - dependencies statically compiled-in - debug symbols
- lern_too_spel 2y agoIt doesn't. The total APK size is less than 100k, including images and sounds.
- mdp2021 2y agoIt compiles to 37kb of 32bit code and to 48kb of 64bit code. /lib/arm64-v8a/libflappybird.so 48kb /lib/armeabi-v7a/libflappybird.so 37kb assets: 29kb icon: 3kb signature: 12kb Plus the manifest (2kb) and resources.arsc (0.5kb)
- 5350-uiop-1130 2y agoi realised recently, there is a correlation between the file size of a game and how likely i am to enjoy it. the smaller the file size the more likely i am to enjoy it. and the opposite is true. i think part of it is time investment. having less time. i dont see much value in 60gb of 4k graphics textures. pac man on the atari or snes is maybe less than 100kb, while modern pac man could be easily 10gb or more. same for tetris or any game with the same gameplay that hasn't changed much.
- coumbaya 2y agoYou'll love Desert Golfing then.
- nubinetwork 2y agoNESert golfing is better...
- imp0cat 2y agoNinja golf...
- animuchan 2y agoI totally support this! Coincidentally I wrote a small 2048-inspired game just recently, it's under 13 KiB (zipped; the "real" file is about 30 KiB): https://js13kgames.com/2024/games/king-thirteen https://js13kgames.com/2024/games/king-thirteen If you're interested to check it out, please tell me what you think :)
- bubblesnort 2y agoThe game I like most is a multiplayer immersive reality game in 0 bytes called frogger, where I'm the frog. Beat that! ;)
- msephton 2y agoI got a GOTY 2023 for my game YOYOZO which is just 39KB and includes custom physics, online high scores, two music tracks, and more. https://news.ycombinator.com/item?id=38372936 https://news.ycombinator.com/item?id=38372936
- mdp2021 2y agoCould this technique, using rawdrawandroid to write C applications for Android, also use raylib (and other C frameworks)? And maybe could this developing system be used through Termux, to have a C development environment on Android for Android?
- deniska 2y agoYes, raylib does support android. I have a slightly incomplete build script I use for my raylib projects (obviously you need to take better care of signing, you probably want to build for other targets besides aarch64, your SDK is probably not installed in /home/denis, and I'm not sure whether I'm adding .so files to apk in a way modern android prefers, but it still works). https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6785d https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
- akirk 2y agoGreat work! Good to see what only it takes to run on Android! On the other hand it also shows how much comes "for free" or made easier by using the provided sdks. For example volume control doesn't work while running this. Also resuming the game after switching away. Maybe that's relatively easy to save and restore state, though.
- sureglymop 2y agoThat's amazing! I wish there was something like rawdrawandroid for Rust.
- ladyanita22 2y agoSame, would like to see the same but implemented in Rust
- userbinator 2y ago"For Android" implies Java is usable, and bytecode can be very dense, so IMHO this could be even smaller.
- MaxBarraclough 2y agoThere's a Flappy Bird clone for the GameBoy, in the form of a 32kB ROM. [0][1][2] This isn't to downplay this Android-based project though. They aren't claiming to have written the most compact Flappy Bird clone. [0] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy/devlog/333675/flappy-bird-gameboy-homebrew-v100-completed https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy/... [1] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy [2] https://www.youtube.com/watch?v=m839Vg_qXzM https://www.youtube.com/watch?v=m839Vg_qXzM
- im3w1l 2y agoI'm honestly surprised at the 100k figure. In my mind it should be possible go far lower. 10k sounds vaguely realistic.
- londons_explore 2y agoif you're willing to compromise on the graphics and just get the core gameplay, I reckon you could do it in a 512 byte x86 bootsector.
- im3w1l 2y agoRight. I meant with the graphics though.
- Lerc 2y agoWeirdly, I think the challenge would be more difficult going to Android than adding graphics while keeping the size down. It would not at all surprise me to see a near perfect Flappy Bird under 4k (graphics and all) as a PC .com I'd be curious to see what the minimum size of a simple C program would be. Say something that displayed a pixel that bounced up and down as you tapped.
- melvinroest 2y agoTangentially related, I once wrote a literature review on why people play Flappy Bird. I was a graduate student in game studies at the time. Ultimately, I never pursued the academic route, just sharing it for fun. For the curious minds, here it is [1]. [1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf http://www.fdg2015.org/papers/fdg2015_paper_60.pdf
- mctt 2y ago"It is surmised that conditioning is enforced via several cogni- tive biases that trick a player into expecting euphoria (liking- pathway), when instead frustration is yielded – with condi- tioning being iterated to a point that the player is motivated to interact with the game on a foremost instinctual level. We posit that these stimulations of the wanting-pathway may lead to players interacting with the game not only with- out actually liking it, but also without knowing why they are interacting with the game. Indeed, this calls for drawing another parallel between drug addiction, and play behaviour in which liking may be barely exhibited (cf. [16, 38, 40])."
- ddev0 2y agoI have always felt there is something fascinating going on behind Flappy Birds' infamous difficulty curve that warrants deeper study. On the one hand, there is no actual progression or ramping of difficulty in the game itself. The difficulty level remains the same whether your current score is 0 or 10 or 100. But every new highscore represents a new summit that the player has to scale. The first and maybe the most frustrating summit to scale is scoring a single point. To get your score into the double digits, the player has to have basic mastery of the core mechanics - including the precise physics, and timings- and learn how to handle a certain number of scenarios. The obstacles on the path to triple-digit territory and beyond seem almost self-imposed. The fear and tension as you approach your own highscore is the biggest impediment to breaking your highscore. Once you break that highscore - the hand tremors magically disappear the next time you approach it, only for it to re-appear as you near your new highscore. All this, when the basic concept of the gameplay is deceptively simple. Like i said, there are many layers to unpack for someone who is willing to look into it.
- nubinetwork 2y agoSo this is an android apk, and not a Linux app that just happens to run on android? I'd really be curious as to why most android apps are huge...
- freitzzz 2y agoMost Android apps are huge because they bundle tons of assets just to accommodate the “initial experience of the user”. Also, using bloat libraries and frameworks (any shipped by Google), increase the apk size. Nowadays Google offers a solution for this problem called app bundling. It’s especially good if you build a mono app that behaves differently in certain regions. Instead of delivering a raw apk, you deliver a region specific app bundle.
- londons_explore 2y agoI'm unaware of any apps that behave totally differently in different regions. Sure - there are sometimes a few disabled features in one region or another, but is that really worth shipping a totally different binary for? Even language packs can be tiny even for 200+ languages if they're pure text. It's only when you get language/region specific artwork that there's a problem.
- freitzzz 2y agoYou’d be surprised how heavy a language pack is!
- immibis 2y agoI made a sub-100k Android app once (I am now banned from the Play Store, and I should be lucky they didn't delete my Gmail account too) and every time I opened the IDE (Android Studio at the time) it would automatically add a Google "support library" to the project that Google obviously wanted to force me to use. If I forgot to remove it and built the app, it would be closer to 10MB. So that was the minimum size of almost every Android app at the time.
- laweijfmvo 2y agoisn't this kind of what Flutter is? a (relatively big) framework to just draw frames to a barebones Android app.
- seabass-labrax 2y agoOn a technicality, yes, but I think most developers who use it do so because of the large collection of React-style user interface components which are built into it. Now that Jetpack Compose exists (which allows for traditional Java-based widgets to be used in a 'reactive' way), personally I don't see any reason to use Flutter. That 'drawing directly' aspect puts Flutter apps several years behind in terms of performance, accessibility and reliability, since pretty much everything in the Android API needs to be reimplemented in Dart.
- londons_explore 2y agoReally wish the app store had a "only apps under 10MB" filter. The fastest, least ad-filled and micropayment filled apps are usually the small ones. By downloading a 3 megabyte thermometer app you'll be much happier than a 150 megabyte thermometer app.
- onlyforthat 2y agoI remember there was a publisher in Play Store who had very small apps like single digit kb flashlight, sudoku, calender, etc. I can't find them now. Those apps were really small all within <200kb
- butz 2y agoGoogle Play probably kicked them off for not using latest Android SDK or something. So many tiny and high quality apps were lost.
- johnisgood 2y agoGoogle is not only killing their own projects, but other people's, too.
- refulgentis 2y agoI'm no fan of Google, but it's slightly more complicated than that, there's a lot of security and privacy stuff that can't be enforced if your app was build 6 years ago and still slopping around.
- tourmalinetaco 2y agoDoes that really matter for a local-only 5KB app that only talks with my phone‘s flashlight, or reads sensor data? Now, maybe for the 500MB adware-filled “flashlight” app that connects to 100s of servers and demands access to everything my device can do, but that would be banned on any competent app store anyway.
- robbiewxyz 2y agoThis reminds me of code golf, an activity I had some good fun with as a young teen. Coincidentally, one of my first contributions to the community was a low fidelity "flappy bird" clone in less than 0.5 kb of javascript. Maybe someone will find fascination in my old hobby and its surrounding community: https://codegolf.stackexchange.com/a/23452 https://codegolf.stackexchange.com/a/23452
- lifthrasiir 2y agoDo you still accept more optimizations? :-) I believe there are tons of mechanical substitutions that can be made there, for example `i%17?r+=z:r+='|\n|'+z` should simplify into `r+=i%17?z:'|\n|'+z`.
- forgotpwd16 2y agoIf constrained by size of result rather source you get sizecoding, a generalization of demoscene.
- huem0n 2y agoNice codebase . That's some if the best looking C I've seen in a while.
- johnisgood 2y agoNothing special. Many inconsistencies, e.g. inconsistent variable naming (mixes snake camelCase and PascalCase). What kind of codebases are you looking at? I have seen way better ones. https://git.zx2c4.com https://git.zx2c4.com has better. OpenBSD is great, too.
- tiffanyh 2y agoSuper Mario Bros was just 40KB https://news.ycombinator.com/item?id=21213421 https://news.ycombinator.com/item?id=21213421
- mouse_ 2y agoIt was also made to work on exactly one hardware specification, with no operating system to speak of. This flappy bird clone works on an immeasurable number of devices, with varying hardware AND software configurations!
- tiffanyh 2y agoCosmo gives you what you described above and it’s <10kb https://github.com/jart/cosmopolitan https://github.com/jart/cosmopolitan
- jart 2y agoWell these days cosmocc -mtiny is more like 120kb, now that our binaries support ARM platforms too (like Android!) and all the code I've needed to add to make sure Cosmo works reliably for a longer tail of edge cases. But that's saying a lot, since unlike these APKs cosmo binaries don't need a gigabyte JDK to run.
- tiffanyh 2y agoDoes Cosmo support for OpenBSD change at all due to pinsyscalls? https://man.openbsd.org/pinsyscalls.2 https://man.openbsd.org/pinsyscalls.2
- jart 2y agoI don't think so. OpenBSD 7.3 works great. Their latest release broke APE in two ways: https://github.com/jart/cosmopolitan/issues/1263 https://github.com/jart/cosmopolitan/issues/1263 I'm not sure if something like this is an accident. We might need to shift our support to something like DragonflyBSD, Haiku, or SerenityOS if OpenBSD doesn't want us there.
- cies 2y agoInteresting to see what a Windows-based project looks like. I haven't used Windows for ages. Seeing the .bat files and vsproj files gave me nostalgic feelings.
- p0w3n3d 2y agoToo fast on my Samsung A52s
- krackers 2y agoSeems this was fixed in https://github.com/VadimBoev/FlappyBird/commit/f57a3ec90078b74ac40a4331ecb71e65cc0e09f3 https://github.com/VadimBoev/FlappyBird/commit/f57a3ec90078b... by forcing the gameloop to be 60fps. It's a simple solution, but does mean that things are effectively capped at 60fps. The techniques in https://gafferongames.com/post/fix_your_timestep/ https://gafferongames.com/post/fix_your_timestep/ could be used to properly allow variable fps while maintaining constant physics speed.
- psanchez 2y agoI was under de impression java gluing was required to create Android APKs. Really nice to see this project. 0 java files. Bravo. Also worth looking at the rawandroid project like others noted: https://github.com/cnlohr/rawdrawandroid/tree/master https://github.com/cnlohr/rawdrawandroid/tree/master
- klibertp 2y agoThe reason you have Java glue instead of C glue in most cases is that Java's is easier to write. Whatever you do, you need a Activity instance to run, and while you can create one from C, it requires a lot of boilerplate that is mostly taken care of by inheritance in Java. Here's how it's done in plain C: https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBird/app/src/main/jni/android_native_app_glue.c https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi... https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBird/app/src/main/jni/android_native_app_glue.h https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi...
- pjmlp 2y agoAlso even the "pure" C one depends on Java, because Activities exist only on the Java side of Android. In practice to be usable on a standard Android system, native code must always be compiled to a shared object, with JNI entry points to be called from Java userspace. The only option is to write such native methods ourselves, or use one of the two predefined Activities for NDK that already expect specific functions to be present on the shared library. Additionally, the zero Java part only works, if what NDK exposes as stable API is enough, and from Google's point of view, that is only for games, or faster compute, everything else requires JNI fun. As tip, it is easier to deal with Android IPC for Java <-> NDK communication, than going through JNI boilerplate.
- mouse_ 2y agoCouldn't one simply make the boilerplate once, as a library, that takes the pertinent bits as arguments? In which case if your app is C anyways it would make sense to just keep it simple with that.
- infomiho 2y agoMissed opportunity: name it Floppy Bird since it fits on a 3.5 inch floppy disk.
- kragen 2y agohere in argentina everyone calls it 'floppy beard'. and of course 'angry birds' is 'ongry beards'
- userbinator 2y agoThat came to mind for me too, but unfortunately the name has already been taken by a few clones; the most notable being a trivial reskin that uses a floppy disk icon instead of a bird.
- dielll 2y agoAdd it to Fdroid
- charles_f 2y agoThis is impressive, especially that it's fully in C. I'm wondering, can you debug C apps on Android?
- mdp2021 2y agoPossibly through Termux... Surely for shell commands, I would say; I am not sure about hooking the debugger to a package
- kernal 2y agoAndroid Studio allows you to debug Java, C/C++ or dual Java and C/C++ apps. https://developer.android.com/studio/debug https://developer.android.com/studio/debug
- jaakl 2y agoWhy so many bytes? I wrote one using just 141 bytes and it took just few seconds to write, and it is the first functional game I've ever written). Result: https://claude.site/artifacts/3b35069f-4d51-4415-9f58-69988cd058cd https://claude.site/artifacts/3b35069f-4d51-4415-9f58-69988c...
- kragen 2y agonice! but how big is the .apk?
- squeaky-clean 2y agoI'm not sure if this is a joke or not, but there's no actual graphics in this besides a yellow ball and green rectangles, while the OP game has actual textured pipes, a textured floor, a background scene. The score counter looks to use a basic system or browser font, while the OP game has a custom font. The OP game has also high score tracking, sharing, a proper main screen instead of just dropping you into gameplay.
- girvo 2y agoIt's a haha-only-serious joke about using a prompt to write it. Sort of impressive it's even that far along, but OP's effort is far more interesting to me
- jaakl 2y agoYep it is not to OP really. Just observation how programming numbers works nowadays: I had my first useful miniprogram using about 3-4 cryptic bytes about 33 years ago, now you can make a playable game with <200 chars of human language. It is of course “compiled” to megabytes with a tera+byte scale interpreter, but meaningful source is in human scale (again).
- boomlinde 2y agoThat was a 20 megabyte page load for me even with all the ad cruft blocked...to load a game in a browser, which is already the most batteries-included application platform I can think of.
- justmarc 2y agoIt is refreshing, and nice to see programs/games/apps that are "crafted" vs just slapped together out of existing, bloated third party components.
- akavel 2y agoI did something similar in Nim and published it in 2020 (less pretty graphics however). The difference is that I went deeper and actually wrote an assembler for the Dalvik bytecode and .apk files: https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DRwTIEzUpfaIcBqhsj09mLWHx&index=13 https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR... The code in the repo has unfortunately bitrotten. I am sometimes thinking to try and resurrect it Some Day™... from time to time I think of some simple app I could write if it was a bit more polished.
- saturn5k 2y agoYou should check out .kkrieger an fps game in 96kb. A relic from the demoscene.
- slmjkdbtl 2y agoI see RenderTexture() is creating and uploading to GLBuffer every frame, is that ok for performance? https://github.com/VadimBoev/FlappyBird/blob/bf3287d90d93ec050d7b65b14323885ce1bb2f4b/FlappyBird/app/src/main/jni/texture.c#L72 https://github.com/VadimBoev/FlappyBird/blob/bf3287d90d93ec0...
- kunalgupta022 2y agoThis game is legend.
- mvdtnz 2y agoI think what's interesting about reading code like this is that it's just not very complicated. You might go in there expecting to see some kind of complicated code golf or some fancy tricks to keep file size down. But as always it's just a matter of writing simple, understandable code and just being a little thoughtful.