- Flappy Bird, chỉ dùng C, không dùng Java/Kotlin, APK (armeabi-v7a +arm64-v8a) nặng < 100 kilobyte
Lịch sử:
- Năm 2021, phát hiện kho rawdrawandroid
- Có động lực tạo một trò chơi đơn giản với kích thước APK nhỏ nhất có thể
- Quyết định làm một bản sao của trò chơi Flappy Bird
- Lần thử đầu tiên được thực hiện bằng C++ và ImGui nhưng thất bại
- Kích thước APK khoảng 1 megabyte
- Có khả năng trò chơi bị crash
- APK chỉ bao gồm thư viện armeabi-v7a
- Cấu trúc dự án phức tạp và chưa được sắp xếp gọn gàng
Động lực:
- Vào ngày 14 tháng 9 năm 2024, trên kênh Discord của Raylib, đã thấy một người làm Flappy Bird bằng C#
- Muốn thử thách ý tưởng tạo APK Android bằng ngôn ngữ C với kích thước dưới 100 kilobyte
- Trong bối cảnh hiện nay khi APK có thể lên tới 500 megabyte, việc giữ dưới 100 kilobyte là điều rất khó
- Cuối cùng đã thành công, nhưng không hề dễ dàng
Triển khai:
- Ban đầu biên dịch Hello World bằng C, đóng gói thư viện thành APK rồi chuyển sang thiết bị qua USB
- Bắt đầu tìm hiểu các tài nguyên của trò chơi
- Lúc đầu dùng âm thanh định dạng ogg nhưng phát sinh vấn đề, sau đó chuyển sang mp3 để nén
- Đã thử dùng BASS để phát âm thanh nhưng quá nặng, nên học OpenSLES để đọc định dạng MP3 mà không gặp vấn đề
- Dùng ảnh png, tìm thấy upng nhẹ hơn stb_image và giải quyết được vấn đề giải mã
- Render bằng OpenGL ES 2 + shader, phát âm thanh bằng OpenSLES, giải mã png bằng upng, sử dụng Android Native Activity
Build:
- Tải Visual Studio 2022
- Mở Visual Studio Installer
- Nhấp "Edit"
- Chọn các mục phát triển ứng dụng C++ cổ điển và phát triển ứng dụng di động C++
- Tải Android Studio (cần apktool, sdk, ndk)
- Cài đặt NDK 25.2.9519653 (có thể dùng bản cao hơn)
- Cấu hình dự án đang để là "Debug ARM", nhưng cần sửa đường dẫn trong build.bat
- Nhấn CTRL + B để biên dịch
Bản quyền:
- Không tuyên bố bản quyền. Quyền đối với trò chơi và tài nguyên thuộc về DotGEARS
Cảm hứng:
- rawdrawandroid
- Flapper
- Raylib
- ImGui
Tóm tắt của GN⁺:
- Dự án này là một nỗ lực đầy thử thách nhằm tạo trò chơi Flappy Bird cho Android bằng ngôn ngữ C
- Đã thành công trong việc triển khai trò chơi đồng thời giữ kích thước APK dưới 100 kilobyte
- Tối ưu hóa tài nguyên bằng nhiều công nghệ như OpenGL ES 2, OpenSLES và upng
- Dự án này mang lại góc nhìn hữu ích cho kỹ sư phần mềm về phát triển trò chơi hiệu quả với kích thước nhỏ
- Các dự án có chức năng tương tự gồm Raylib và rawdrawandroid
1 bình luận
Ý kiến trên Hacker News
Ước gì cửa hàng ứng dụng có bộ lọc "ứng dụng dưới 10MB"
Chia sẻ trải nghiệm 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
Chia sẻ trải nghiệm từng xuất bản một dự án tương tự bằng Nim vào năm 2020
Mã nguồn ít hơn 4k loc
Super Mario Bros chỉ có 40KB
Từng nghĩ cần Java glue code để tạo Android APK
Thật sự rất ngầu khi thấy một ứng dụng Android dưới 1MB
Giá mà được đặt tên là "Floppy Bird"
Thật sảng khoái và đáng mừng khi thấy những chương trình/trò chơi/ứng dụng được "chế tác cẩn thận" thay vì các thành phần bên thứ ba cồng kềnh như thường thấy
Tò mò liệu kỹ thuật viết ứng dụng C cho Android bằng rawdrawandroid có thể được dùng với raylib (và các framework C khác) hay không