4 คะแนน โดย GN⁺ 2024-09-23 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Flappy Bird, only C, without Java/Kotlin, weight APK (armeabi-v7a +arm64-v8a) < 100 kilobytes

ประวัติ:

  • ค้นพบรีโพ rawdrawandroid ในปี 2021
  • เกิดแรงบันดาลใจอยากสร้างเกมง่าย ๆ ที่มีขนาด APK เล็กที่สุดเท่าที่ทำได้
  • ตัดสินใจทำเกมโคลนของ Flappy Bird
  • ความพยายามครั้งแรกใช้ C++ และ ImGui แต่ไม่สำเร็จ
    • ขนาด APK อยู่ที่ราว 1 เมกะไบต์
    • มีโอกาสที่เกมจะล่ม
    • ใน APK มีเพียงไลบรารี armeabi-v7a เท่านั้น
    • โครงสร้างโปรเจ็กต์ซับซ้อนและจัดระเบียบไม่ดี

แรงจูงใจ:

  • วันที่ 14 กันยายน 2024 เห็นคนที่สร้าง Flappy Bird ด้วย C# ในช่อง Discord ของ Raylib
  • เลยอยากลองท้าทายไอเดียการทำ APK สำหรับ Android ด้วยภาษา C ให้มีขนาดต่ำกว่า 100 กิโลไบต์
  • ในยุคที่ทุกวันนี้ APK มีขนาดไปถึง 500 เมกะไบต์ การคงขนาดไว้ต่ำกว่า 100 กิโลไบต์เป็นเรื่องยากมาก
  • สุดท้ายก็ทำสำเร็จ แต่ไม่ใช่เรื่องง่าย

การพัฒนา:

  • เริ่มจากคอมไพล์ Hello World ด้วย C แล้วแพ็กไลบรารีเป็น APK และส่งไปยังอุปกรณ์ผ่าน USB
  • เริ่มสำรวจทรัพยากรของเกม
  • ตอนแรกใช้เสียงรูปแบบ ogg แต่มีปัญหา ภายหลังจึงเปลี่ยนเป็น mp3 แล้วบีบอัด
  • เคยพยายามใช้ BASS เพื่อเล่นเสียง แต่หนักเกินไป จึงไปศึกษา OpenSLES เพื่อให้อ่านไฟล์ MP3 ได้โดยไม่มีปัญหา
  • ใช้ภาพ png และหา upng ที่เบากว่า stb_image เพื่อแก้ปัญหาการถอดรหัส
  • เรนเดอร์ด้วย OpenGL ES 2 + เชดเดอร์, เล่นเสียงด้วย OpenSLES, ถอดรหัส png ด้วย upng, และใช้ Android Native Activity

การบิลด์:

  • ดาวน์โหลด Visual Studio 2022
    • เปิด Visual Studio Installer
    • คลิก "Edit"
    • เลือกตัวเลือก C++ classic application development และ C++ mobile application development
  • ดาวน์โหลด Android Studio (ต้องใช้ apktool, sdk, ndk)
    • ติดตั้ง NDK 25.2.9519653 (ใช้เวอร์ชันที่สูงกว่านี้ก็ได้)
  • การตั้งค่าโปรเจ็กต์เป็น "Debug ARM" แต่ต้องแก้พาธใน build.bat
  • คอมไพล์ด้วย CTRL + B

ลิขสิทธิ์:

  • ไม่อ้างสิทธิ์ลิขสิทธิ์ โดยสิทธิ์ของตัวเกมและทรัพยากรเป็นของ DotGEARS

แรงบันดาลใจ:

  • rawdrawandroid
  • Flapper
  • Raylib
  • ImGui

สรุปโดย GN⁺:

  • โปรเจ็กต์นี้คือความพยายามที่ท้าทายในการสร้างเกม Flappy Bird สำหรับ Android ด้วยภาษา C
  • สามารถทำเกมได้สำเร็จพร้อมรักษาขนาด APK ให้ต่ำกว่า 100 กิโลไบต์
  • ใช้เทคโนโลยีหลากหลายอย่าง เช่น OpenGL ES 2, OpenSLES และ upng เพื่อเพิ่มประสิทธิภาพทรัพยากร
  • โปรเจ็กต์นี้มอบมุมมองเชิงลึกให้วิศวกรซอฟต์แวร์เกี่ยวกับการพัฒนาเกมขนาดเล็กที่มีประสิทธิภาพ
  • โปรเจ็กต์ที่มีแนวคิดคล้ายกัน ได้แก่ Raylib และ rawdrawandroid

1 ความคิดเห็น

 
GN⁺ 2024-09-23
ความคิดเห็นจาก Hacker News
  • อยากให้มีตัวกรอง "แอปขนาดไม่เกิน 10MB" ใน app store

    • แอปเล็ก ๆ มักทำงานได้เร็วกว่าและมีโฆษณาหรือการจ่ายเงินย่อยน้อยกว่า
    • แอปวัดอุณหภูมิขนาด 3MB ให้ความรู้สึกน่าพอใจกว่าแอปวัดอุณหภูมิขนาด 150MB
  • มีการแชร์ประสบการณ์ที่เคยเขียนบททบทวนวรรณกรรมว่าทำไมผู้คนถึงเล่น Flappy Bird

    • เป็นเรื่องสมัยที่เป็นนักศึกษาบัณฑิตศึกษาด้านการวิจัยเกม
    • ลิงก์บทความ: http://www.fdg2015.org/papers/fdg2015_paper_60.pdf
  • มีการแชร์ประสบการณ์ว่าเคยเผยแพร่โปรเจกต์คล้ายกันด้วย Nim ในปี 2020

  • โค้ดมีขนาดไม่ถึง 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 เคยมีขนาด 40KB

  • เคยคิดว่าจำเป็นต้องมีการเชื่อมด้วย Java เพื่อสร้าง Android APK

    • เลยแปลกใจที่โปรเจกต์นี้ไม่มีไฟล์ Java เลย
    • โปรเจกต์ rawandroid ก็น่าลองดูเช่นกัน
    • ลิงก์: https://github.com/cnlohr/rawdrawandroid/tree/master
  • การได้เห็นแอป Android ขนาดต่ำกว่า 1MB เป็นอะไรที่ยอดเยี่ยมจริง ๆ

    • รันได้แม้บน HTC รุ่นเก่า
    • ขอแสดงความยินดี
  • น่าจะตั้งชื่อว่า "Floppy Bird"

    • เพราะมันใส่ลงในแผ่นฟลอปปีดิสก์ขนาด 3.5 นิ้วได้
  • การได้เห็นโปรแกรม/เกม/แอปที่ "ประดิษฐ์อย่างพิถีพิถัน" แทนการพึ่งคอมโพเนนต์ third-party ที่บวมเกินความจำเป็น เป็นเรื่องสดชื่นและน่าชอบมาก

  • สงสัยว่าเทคนิคการเขียนแอปพลิเคชัน C บน Android โดยใช้ rawdrawandroid จะใช้กับ raylib (รวมถึงเฟรมเวิร์ก C อื่น ๆ) ได้ด้วยหรือไม่

    • สงสัยว่าสามารถใช้สภาพแวดล้อมพัฒนา C สำหรับ Android บน Android ผ่าน Termux ได้หรือไม่