Flappy Bird cho Android, viết bằng C, dưới 100KB
(github.com/VadimBoev)- Dự án này nhằm hiện thực một bản clone Flappy Bird cho Android bằng C, đồng thời giảm kích thước APK xuống dưới 100KB
- Sau khi biết đến rawdrawandroid vào năm 2021, tác giả muốn tạo một game có APK nhỏ, và việc nhìn thấy C# Flappy Bird trên Raylib Discord vào tháng 9/2024 đã trở thành động lực để thử hiện thực bằng C
- Cách triển khai là đóng gói thư viện native viết bằng C vào APK, kết hợp OpenGL ES 2, shader và Android Native Activity
- Âm thanh được nén bằng MP3 và phát qua OpenSLES, còn giải mã PNG thì dùng upng
- Việc build hỗ trợ Visual Studio Code trên Windows và Makefile trên Linux/macOS, đồng thời nêu rõ quyền đối với game và tài nguyên thuộc về DotGEARS
Mục tiêu và bối cảnh dự án
- Flappy Bird in C là dự án viết một bản clone Flappy Bird chạy trên Android bằng C và giữ kích thước APK dưới 100KB
- Điểm khởi đầu là rawdrawandroid mà tác giả biết đến vào năm 2021, với mục tiêu tạo ra một game vừa tối thiểu hóa kích thước APK vừa dễ hiểu và thú vị
- Vì Flappy Bird đã có nhiều bản port bằng nhiều ngôn ngữ khác nhau, nó tự nhiên trở thành đối tượng phù hợp để làm clone
Các thử nghiệm trước đây và vấn đề gặp phải
- Năm 2021, tác giả đã học Raylib và lần thử đầu tiên làm game bằng C++ với ImGui đã thất bại
- Khi đó có nhiều vấn đề
- Kích thước APK khoảng 1MB
- Game bị crash
- APK chỉ chứa thư viện armeabi-v7a
- Theo yêu cầu của Google từ năm 2022, cần phải bao gồm thư viện arm64-v8a
Động lực thử lại trong năm 2024
- Sau khi nhìn thấy C# Flappy Bird trong kênh Raylib Discord vào tháng 9/2024, tác giả bắt đầu thử hiện thực Flappy Bird cho Android bằng C và đưa APK xuống dưới 100KB
- Mục tiêu có vẻ phi thực tế, nhưng sự hứng thú mang tính cạnh tranh đã trở thành động lực triển khai
Cách triển khai
- Khởi đầu là biên dịch một chương trình Hello World viết bằng C và đóng gói thư viện đó thành APK
- Âm thanh được nén ở định dạng MP3 và phát bằng OpenSLES
- Việc giải mã file PNG sử dụng upng
- Phần đồ họa và tích hợp Android dùng kết hợp OpenGL ES 2, shader và Android Native Activity
Cách build
- Trên Windows, dự án lấy môi trường Visual Studio Code làm chuẩn
- Tạo
.envtừ.env.example - Chạy
build.bat
- Tạo
- Trên Linux và macOS, có thể build bằng Makefile được cung cấp
- Cần cài Android command-line tools
- Thiết lập biến môi trường trong file
.envở thư mục gốc dự án - Chạy
cd FlappyBirdrồimake
- Hướng dẫn tham khảo
BUILDING.mdđể xem quy trình build chi tiết hơn - APK đã ký sẽ được tạo tại
FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk
Bản quyền và các dự án tham khảo
- Tác giả dự án không tuyên bố bản quyền, và nêu rõ quyền đối với game cùng tài nguyên thuộc về DotGEARS
- Các dự án truyền cảm hứng gồm
1 bình luận
Các ý kiến trên Hacker News
Ước gì App Store có bộ lọc chỉ xem ứng dụng dưới 10MB
Những ứng dụng nhanh nhất và ít quảng cáo/giao dịch vi mô nhất thường là các ứng dụng nhỏ
Khả năng cao bạn sẽ hài lòng hơn nhiều khi tải một ứng dụng nhiệt kế 3MB thay vì một ứng dụng nhiệt kế 150MB
Những ứng dụng đó thực sự rất nhỏ, tất cả đều dưới 200KB
Các nhà tuyển dụng thường yêu cầu sản phẩm để trình diễn như một portfolio nghệ thuật, ngay cả với những ứng dụng không còn tồn tại hoặc server vận hành đã ngừng hoạt động
Tiêu chí còn tùy tiện hơn là họ muốn kiểm tra xem bạn đã từng làm ứng dụng lớn chưa; nếu dùng nhiều kỹ thuật tối ưu trông có vẻ thể hiện năng lực để tạo ra gói 8–12MB, thì lại bị xem như tín hiệu rằng ứng dụng, dịch vụ và tệp người dùng của bạn nhỏ
Thực tế dù có hàng trăm triệu lượt tải và người dùng thì cũng chẳng liên quan gì đến tiêu chí đó; trong lĩnh vực này có động lực khổng lồ để tạo ra các ứng dụng phình to
Ví dụ, phải tìm đến lần thứ 9, kể cả có quảng cáo, tôi mới thấy một ứng dụng nhiệt kế vượt 7MB
Tôi đã làm việc vài năm trên cả hai nền tảng nhưng không rõ lý do chính xác; đoán thì có thể là vì Android có truyền thống vector art mạnh hơn nhiều so với bitmap, còn thư viện Swift, nhờ tính ổn định ABI, trong nhiều năm vẫn phải được compile kèm vào ứng dụng cho đến khi dùng được liên kết động phía hệ điều hành
Ước gì có thể lọc các ứng dụng trả phí, không quảng cáo, và đôi khi cũng không có mua hàng trong ứng dụng
Hơi ngoài lề một chút, nhưng trước đây tôi từng viết một bài tổng quan tài liệu về lý do mọi người chơi Flappy Bird
Khi đó tôi là nghiên cứu sinh ngành nghiên cứu game, cuối cùng không đi theo học thuật, nhưng chia sẻ cho vui
Ai tò mò thì ở đây [1]
[1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf
Một mặt, bản thân trò chơi không có tiến trình thực sự hay độ khó tăng dần. Dù điểm hiện tại là 0, 10 hay 100 thì độ khó vẫn như cũ
Nhưng mỗi kỷ lục mới lại trở thành một đỉnh núi mới mà người chơi phải vượt qua. Đỉnh đầu tiên, và có lẽ là khó chịu nhất, là ghi được 1 điểm; để đạt điểm hai chữ số, về cơ bản phải thành thạo thao tác cốt lõi gồm vật lý và timing chính xác, đồng thời học cách xử lý nhiều tình huống
Các chướng ngại để lên ba chữ số trở lên gần như có vẻ do chính người chơi tự tạo ra; nỗi sợ và căng thẳng khi tiến gần kỷ lục cá nhân là rào cản lớn nhất ngăn họ phá kỷ lục
Một khi vượt qua kỷ lục đó, lần sau khi tiếp cận mốc ấy chứng run tay biến mất như phép màu, nhưng khi tiến gần kỷ lục mới thì nó lại xuất hiện
Khái niệm gameplay cơ bản đơn giản đến mức dễ đánh lừa, nhưng với ai muốn nhìn kỹ thì có nhiều tầng để bóc tách
https://www.foddy.net/Athletics.html
Dưới 4 nghìn dòng
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
Đây không phải chương trình phức tạp đến vậy, nên thành thật mà nói 4 nghìn dòng cũng là quá nhiều
Năm 2020 tôi từng làm và công khai một thứ tương tự bằng Nim, nhưng đồ họa kém đẹp hơn
Điểm khác biệt là tôi đi sâu hơn và thực sự viết cả assembler cho Dalvik bytecode và file .apk
https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
Đáng tiếc là code trong repository đã hỏng theo thời gian, và thỉnh thoảng tôi nghĩ một ngày nào đó sẽ khôi phục lại
Đôi khi tôi nảy ra những ứng dụng có thể làm đơn giản nếu thứ đó được trau chuốt thêm một chút
Thực sự rất tuyệt
Thật thích khi thấy ứng dụng Android dưới 1MB chạy ở mọi nơi, kể cả trên HTC đời cũ
Tôi cứ nghĩ để tạo APK Android thì cần mã nối bằng Java, nhưng xem dự án này thấy hay thật
0 tệp Java quả là tuyệt vời
Dự án rawandroid mà người khác nhắc đến cũng đáng xem
https://github.com/cnlohr/rawdrawandroid/tree/master
Dù làm gì, để chạy được thì cũng cần một instance Activity, và tuy trong C cũng có thể tạo, nhưng sẽ cần rất nhiều mã boilerplate mà trong Java phần lớn được xử lý bằng kế thừa
Với C thuần thì làm như thế này: https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi... https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi...
Super Mario Bros chỉ có 40KB
https://news.ycombinator.com/item?id=21213421
Bản sao Flappy Bird này chạy trên vô số thiết bị với đủ loại cấu hình phần cứng và phần mềm khác nhau
Vì nó nhét vừa vào đĩa mềm 3,5 inch nên họ đã bỏ lỡ cơ hội đặt tên là Floppy Bird
Nổi bật nhất là một bản chỉ đổi skin đơn giản, dùng biểu tượng đĩa mềm thay cho con chim
Tất nhiên “angry birds” thì là “ongry beards”
Liệu kỹ thuật dùng rawdrawandroid để tạo ứng dụng C cho Android này có thể áp dụng cho các framework C khác như raylib không?
Và liệu có thể dùng hệ thống phát triển này thông qua Termux để tạo một môi trường phát triển C cho Android ngay trên Android không?
Tôi có một script build hơi chưa hoàn thiện dùng cho dự án raylib của mình
Dĩ nhiên cần xử lý việc ký cho đúng hơn, có thể bạn cũng muốn build cho các mục tiêu ngoài aarch64, và SDK cũng chưa chắc đã được cài ở /home/denis
Ngoài ra tôi không chắc cách thêm tệp .so vào apk có phải là cách Android hiện đại ưu tiên hay không, nhưng hiện vẫn chạy
https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
Nếu là “cho Android” thì nghĩa là có thể dùng Java, mà bytecode có thể rất cô đặc, nên có lẽ còn có thể làm nhỏ hơn nữa
Nói vậy không phải để hạ thấp dự án dựa trên Android này. Vì họ cũng không tuyên bố đã tạo ra bản sao Flappy Bird nhỏ nhất
[0] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy/...
[1] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy
[2] https://www.youtube.com/watch?v=m839Vg_qXzM
Trong đầu tôi thì đáng ra có thể xuống thấp hơn nhiều, và 10KB nghe lờ mờ cũng có vẻ thực tế