- 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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
อยากให้มีตัวกรอง "แอปขนาดไม่เกิน 10MB" ใน app store
มีการแชร์ประสบการณ์ที่เคยเขียนบททบทวนวรรณกรรมว่าทำไมผู้คนถึงเล่น Flappy Bird
มีการแชร์ประสบการณ์ว่าเคยเผยแพร่โปรเจกต์คล้ายกันด้วย Nim ในปี 2020
โค้ดมีขนาดไม่ถึง 4k loc
Super Mario Bros เคยมีขนาด 40KB
เคยคิดว่าจำเป็นต้องมีการเชื่อมด้วย Java เพื่อสร้าง Android APK
การได้เห็นแอป Android ขนาดต่ำกว่า 1MB เป็นอะไรที่ยอดเยี่ยมจริง ๆ
น่าจะตั้งชื่อว่า "Floppy Bird"
การได้เห็นโปรแกรม/เกม/แอปที่ "ประดิษฐ์อย่างพิถีพิถัน" แทนการพึ่งคอมโพเนนต์ third-party ที่บวมเกินความจำเป็น เป็นเรื่องสดชื่นและน่าชอบมาก
สงสัยว่าเทคนิคการเขียนแอปพลิเคชัน C บน Android โดยใช้ rawdrawandroid จะใช้กับ raylib (รวมถึงเฟรมเวิร์ก C อื่น ๆ) ได้ด้วยหรือไม่