4 điểm bởi GN⁺ 2024-09-23 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

 
GN⁺ 2024-09-23
Ý 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"

    • Ứng dụng nhỏ thường nhanh hơn và có ít quảng cáo hay thanh toán vi mô hơn
    • Một ứng dụng nhiệt kế 3MB đem lại cảm giác hài lòng hơn một ứng dụng nhiệt kế 150MB
  • 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

    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 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

    • Có thể chạy cả trên HTC đời cũ
    • Xin chúc mừng
  • Giá mà được đặt tên là "Floppy Bird"

    • Có thể nhét vừa vào đĩa mềm 3.5 inch
  • 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

    • Tò mò liệu có thể dùng môi trường phát triển C cho Android ngay trên Android thông qua Termux hay không