4 điểm bởi GN⁺ 2024-09-23 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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 .env từ .env.example
    • Chạy build.bat
  • 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 FlappyBird rồi make
  • 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

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

    • Trước đây trên Play Store có một nhà phát hành đăng các ứng dụng rất nhỏ, chỉ vài KB, như đèn pin, Sudoku, lịch, nhưng giờ không tìm thấy nữa
      Những ứng dụng đó thực sự rất nhỏ, tất cả đều dưới 200KB
    • Điều này làm tôi nhớ đến một trong những lý do tôi bỏ phát triển ứng dụng di động
      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
    • Tôi vẫn thấy lạ là ứng dụng Android thường nhỏ hơn rất nhiều
      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
    • Với tôi, tín hiệu cảnh báo là tất cả ứng dụng đều miễn phí
      Ướ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
    • Aurora Store ít nhất có thể lọc theo có trả phí hay không, mua hàng trong ứng dụng, có kèm quảng cáo hay khô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

    • Tôi luôn cảm thấy đằng sau đường cong độ khó khét tiếng của Flappy Bird có điều gì đó thú vị đáng nghiên cứu sâu hơn
      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
    • “Việc điều kiện hóa được cho là được củng cố thông qua nhiều thiên kiến nhận thức đánh lừa người chơi kỳ vọng cảm giác hạnh phúc, tức con đường liking, dù thực tế họ nhận được sự thất vọng. Khi điều kiện hóa lặp lại, người chơi được đồng bộ để tương tác với trò chơi ở mức gần như bản năng. Chúng tôi cho rằng sự kích thích con đường wanting này có thể khiến người chơi tương tác dù họ thực sự không thích trò chơi, thậm chí cũng không biết vì sao mình chơi. Trên thực tế, điều này gợi ý rằng cần vẽ thêm một đường song song khác giữa nghiện ma túy và hành vi chơi, nơi liking hầu như không bộc lộ”
    • Với bối cảnh đó thì rất có khả năng bạn đã xem rồi, nhưng dù sao, vì 10.000 người may mắn tôi vẫn nên giới thiệu QWOP
      https://www.foddy.net/Athletics.html
    • Với tư cách chuyên gia Flappy Bird, tôi nói rằng đó là vì mọi người thích xấp xỉ đa thức
  • 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

    • Học viên của tôi được giao bài tập làm game bằng SFML và đã viết một bản sao Flappy Bird chỉ trong vài trăm dòng
      Đâ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
    • Tiếc là 4 nghìn dòng code khi compile lại thành binary hơn 100KB
  • 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ũ

    • Giá mà có cả đánh giá xem tốc độ được cải thiện đến mức nào
  • 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

  • Super Mario Bros chỉ có 40KB
    https://news.ycombinator.com/item?id=21213421

    • Cái đó cũng được làm để chạy trên đúng một cấu hình phần cứng, gần như không có hệ điều hành
      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

    • Tôi cũng nghĩ vậy, nhưng tiếc là đã có vài bản sao lấy mất cái tên đó rồi
      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
    • Ở Argentina mọi người đều gọi là “floppy beard”
      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?

    • Có thể. raylib hỗ trợ Android
      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