4 पॉइंट द्वारा GN⁺ 2024-09-23 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • इस प्रोजेक्ट का लक्ष्य Android के लिए Flappy Bird clone को C में इम्प्लीमेंट करते हुए APK का आकार 100KB से कम रखना है
  • 2021 में rawdrawandroid देखने के बाद छोटे APK वाला गेम बनाने की कोशिश की गई, और 2024 के सितंबर में Raylib Discord पर C# Flappy Bird देखने से C इम्प्लीमेंटेशन की कोशिश की प्रेरणा मिली
  • इम्प्लीमेंटेशन का तरीका C में बनी native library को APK में पैकेज करना है, और इसके लिए OpenGL ES 2, shaders, तथा Android Native Activity को मिलाकर इस्तेमाल किया गया है
  • साउंड को MP3 में compress किया गया है और OpenSLES से चलाया जाता है, जबकि PNG decoding के लिए upng का उपयोग किया गया है
  • build के लिए Windows पर Visual Studio Code और Linux/macOS पर Makefile का समर्थन है, और यह भी स्पष्ट किया गया है कि गेम और resources के अधिकार DotGEARS के पास हैं

प्रोजेक्ट का लक्ष्य और पृष्ठभूमि

  • Flappy Bird in C एक ऐसा प्रोजेक्ट है जिसका उद्देश्य Android पर चलने वाला Flappy Bird clone को C में लिखना और APK का आकार 100KB से कम रखना है
  • इसकी शुरुआत 2021 में देखे गए rawdrawandroid से हुई थी, और लक्ष्य ऐसा गेम बनाना था जो APK आकार को न्यूनतम रखे, फिर भी समझने योग्य और दिलचस्प हो
  • Flappy Bird को पहले ही कई भाषाओं में port किया जा चुका है, इसलिए clone इम्प्लीमेंटेशन के लिए इसे स्वाभाविक रूप से चुना गया

पिछली कोशिश और समस्याएँ

  • 2021 में Raylib सीखा गया, और ImGui का उपयोग करके C++ में गेम बनाने की पहली कोशिश असफल रही
  • उस समय कई समस्याएँ थीं
    • APK का आकार लगभग 1MB था
    • गेम crash हो रहा था
    • APK में केवल armeabi-v7a library शामिल थी
    • Google की 2022 requirements के अनुसार arm64-v8a library शामिल करना जरूरी था

2024 में दोबारा कोशिश की वजह

  • 2024 के सितंबर में Raylib Discord channel पर C# Flappy Bird देखने के बाद, Android के लिए Flappy Bird को C में इम्प्लीमेंट करने और APK को 100KB से कम रखने की कोशिश शुरू की गई
  • लक्ष्य अवास्तविक लग रहा था, लेकिन प्रतिस्पर्धी रुचि ही इम्प्लीमेंटेशन की प्रेरणा बनी

इम्प्लीमेंटेशन का तरीका

  • शुरुआत C में लिखे गए Hello World को compile करने और उस library को APK के रूप में पैकेज करने से हुई
  • साउंड को MP3 format में compress किया गया और OpenSLES का उपयोग करके चलाया गया
  • PNG files की decoding के लिए upng को चुना गया
  • graphics और Android integration के लिए OpenGL ES 2, shaders, और Android Native Activity का साथ में उपयोग किया गया

build करने का तरीका

  • Windows में Visual Studio Code environment को आधार माना गया है
    • .env.example से .env बनाया जाता है
    • build.bat चलाया जाता है
  • Linux और macOS में दिए गए Makefile से build किया जा सकता है
    • Android command-line tools install करना जरूरी है
    • प्रोजेक्ट root की .env file में environment variables सेट करने होते हैं
    • cd FlappyBird के बाद make चलाया जाता है
  • अधिक विस्तृत build प्रक्रिया के लिए BUILDING.md देखने को कहा गया है
  • signed APK FlappyBird/app/build/outputs/apk/FlappyBird-signed.apk पर बनती है

कॉपीराइट और संदर्भ प्रोजेक्ट

  • प्रोजेक्ट के लेखक ने किसी कॉपीराइट का दावा नहीं किया है, और यह स्पष्ट किया है कि गेम और resources के अधिकार DotGEARS के पास हैं
  • प्रेरणा देने वाले प्रोजेक्ट ये हैं

1 टिप्पणियां

 
GN⁺ 2024-09-23
Hacker News की राय
  • काश App Store में सिर्फ 10MB से छोटे ऐप दिखाएं वाला filter होता
    सबसे तेज़ और कम विज्ञापन/माइक्रोपेमेंट वाले ऐप आमतौर पर छोटे ऐप होते हैं
    150MB वाले thermometer ऐप की बजाय 3MB वाला thermometer ऐप डाउनलोड करने पर संतुष्ट होने की संभावना कहीं ज़्यादा होती है

    • पहले Play Store पर एक publisher था जो single-digit KB वाले flashlight, Sudoku, calendar जैसे बहुत छोटे ऐप डालता था, लेकिन अब वह मिल नहीं रहा
      वे ऐप सचमुच इतने छोटे थे कि सभी 200KB से कम थे
    • मुझे mobile app development छोड़ने की एक वजह याद आती है
      recruiters अक्सर उन ऐप्स के लिए भी, जो अब मौजूद नहीं थे या जिनके production servers बंद हो चुके थे, दिखाने लायक result मांगते थे, जैसे कोई art portfolio हो
      इससे भी ज़्यादा मनमाना criterion यह देखना था कि क्या आपने कोई बड़ा ऐप किया है; और अगर आप सक्षम दिखने वाली कई optimization techniques लगाकर 8–12MB package बनाते, तो इसे ऐप/सेवा/user base छोटा होने का संकेत समझ लिया जाता
      असल में भले ही करोड़ों downloads और users हों, उसका उस criterion से कोई लेना-देना नहीं था, और इस field में फूले हुए ऐप बनाने के लिए बहुत बड़ा incentive है
    • मुझे अब भी यह बात अजीब लगती है कि Android ऐप अक्सर काफ़ी छोटे होते हैं
      उदाहरण के लिए, ads सहित 7MB से बड़ा thermometer ऐप खोजने के लिए मुझे 9 बार देखना पड़ा
      मैंने दोनों platforms पर कई साल काम किया है, पर सही वजह नहीं जानता; अंदाज़ा लगाऊं तो Android में bitmaps की तुलना में vector art की परंपरा कहीं मज़बूत है, और Swift libraries को ABI stability के कारण OS-side dynamic linking इस्तेमाल होने से पहले कई सालों तक ऐप में साथ compile करना पड़ता था
    • मेरे लिए red flag यह है कि सभी ऐप free हैं
      काश paid, बिना ads वाले, और कभी-कभी in-app purchases भी न रखने वाले ऐप्स पर filter किया जा सकता
    • Aurora Store कम-से-कम paid/free status, in-app purchases, ads शामिल हैं या नहीं के आधार पर filter कर सकता है
  • थोड़ा विषयांतर है, लेकिन पहले मैंने इस पर एक literature review लिखा था कि लोग Flappy Bird क्यों खेलते हैं
    उस समय मैं game studies का grad student था, और आखिरकार academia में नहीं गया, लेकिन मज़े के लिए share कर रहा हूं
    जिसे उत्सुकता हो, उसके लिए यह यहां है [1]
    [1] http://www.fdg2015.org/papers/fdg2015_paper_60.pdf

    • मुझे हमेशा लगा कि Flappy Bird के बदनाम difficulty curve के पीछे और गहराई से study करने लायक कुछ दिलचस्प है
      एक तरफ़, game में अपने-आप कोई वास्तविक progression या difficulty increase नहीं है। आपका current score 0 हो, 10 हो या 100, difficulty वही रहती है
      लेकिन हर नया high score player के पार करने के लिए एक नई चोटी बन जाता है। पहली और शायद सबसे चिढ़ाने वाली चोटी 1 point हासिल करना है, और double-digit score तक पहुंचने के लिए exact physics और timing सहित core controls को बुनियादी तौर पर master करना और कई situations handle करना सीखना पड़ता है
      triple digits या उससे ऊपर जाने की बाधाएं लगभग self-created लगती हैं, और अपने high score के पास पहुंचने पर होने वाला डर और tension high score तोड़ने की सबसे बड़ी बाधा है
      एक बार आप उस high score को पार कर लें, तो अगली बार वहां पहुंचने पर हाथ कांपना जादू की तरह गायब हो जाता है, लेकिन नए high score के पास पहुंचते ही फिर लौट आता है
      basic gameplay concept धोखा देने लायक simple है, लेकिन जो इसमें झांकना चाहे उसके लिए खोलने को कई layers हैं
    • “conditioning को कई cognitive biases के जरिए मजबूत माना जाता है, जो player को liking pathway, यानी खुशी की expectation करने के लिए छलते हैं, जबकि वास्तव में उसे frustration मिलती है। conditioning दोहराने पर player game के साथ लगभग instinctive स्तर पर interact करने के लिए synchronize हो जाता है। हमारा मानना है कि इस wanting pathway का stimulation player को game से interact करवाता है, जबकि वह वास्तव में game को पसंद नहीं करता और उसे यह भी नहीं पता होता कि वह game क्यों खेल रहा है। वास्तव में, यह drug addiction और ऐसे play behavior के बीच एक और parallel खींचने की ज़रूरत का संकेत देता है जिसमें liking बहुत कम दिखाई देती है”
    • उस background के साथ आपने शायद इसे पहले ही देखा होगा, लेकिन फिर भी lucky 10,000 के लिए QWOP का परिचय देना चाहिए
      https://www.foddy.net/Athletics.html
    • Flappy Bird expert के तौर पर कहूं तो वजह यह है कि लोगों को polynomial approximation पसंद है
  • यह 4 हज़ार lines से कम है
    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

    • मेरे student को SFML से game बनाने का assignment मिला था, और उसने कुछ सौ lines में Flappy Bird clone लिख दिया था
      यह इतना complex program नहीं है, इसलिए ईमानदारी से कहूं तो 4 हज़ार lines भी बहुत ज़्यादा लगती हैं
    • अफ़सोस है कि 4 हज़ार lines का code compile होकर 100KB से बड़ा binary बन जाता है
  • 2020 में मैंने Nim में कुछ ऐसा ही बनाया और release किया था, हालांकि graphics उतने सुंदर नहीं थे
    फर्क यह था कि मैं और गहराई में गया और सचमुच Dalvik bytecode और .apk files के लिए assembler तक लिखा
    https://www.youtube.com/watch?v=wr9X5NCwPlI&list=PLxLdEZg8DR...
    repository का code दुर्भाग्य से समय के साथ टूट गया है, और कभी-कभी सोचता हूं कि किसी दिन इसे फिर जीवित करूं
    कभी-कभी कोई ऐसा app idea आता है जिसे थोड़ी और polish होती तो आसानी से बना सकता था

  • सचमुच शानदार
    1MB से छोटा Android ऐप पुराने HTC पर भी हर जगह चलते देखना अच्छा है

    • अच्छा होता अगर speed improvement कितना है, इसका evaluation भी होता
  • Android APK बनाने के लिए Java glue code चाहिए होगा, ऐसा सोचा था, लेकिन यह प्रोजेक्ट देखकर अच्छा लगा
    0 Java files होना शानदार है
    दूसरों ने जिस rawandroid प्रोजेक्ट का जिक्र किया है, वह भी देखने लायक है
    https://github.com/cnlohr/rawdrawandroid/tree/master

    • ज़्यादातर मामलों में C glue code के बजाय Java glue code इस्तेमाल करने की वजह यह है कि Java वाला हिस्सा लिखना आसान होता है
      कुछ भी करने के लिए चलाने हेतु Activity instance चाहिए, और C में भी इसे बनाया जा सकता है, लेकिन Java में inheritance से ज्यादातर संभल जाने वाला काफी boilerplate code चाहिए होता है
      pure C में यह ऐसे किया जाता है: https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi... https://github.com/VadimBoev/FlappyBird/blob/master/FlappyBi...
  • Super Mario Bros सिर्फ 40KB का था
    https://news.ycombinator.com/item?id=21213421

    • वह भी ठीक एक hardware spec पर, असल में बिना operating system के चलने के लिए बनाया गया था
      यह Flappy Bird clone अलग-अलग hardware और software configuration वाले अनगिनत devices पर चलता है
  • 3.5-inch floppy disk में फिट हो जाता है, इसलिए इसे Floppy Bird नाम देने का मौका चूक गए

    • मैंने भी यही सोचा था, लेकिन अफसोस कि कुछ clones ने पहले ही वह नाम ले लिया है
      सबसे ज्यादा दिखने वाला एक साधारण skin-change version है, जिसमें bird की जगह floppy disk icon इस्तेमाल होता है
    • Argentina में सब इसे ‘floppy beard’ कहते हैं
      जाहिर है, ‘angry birds’ को ‘ongry beards’ कहा जाता है
  • rawdrawandroid से Android के लिए C applications बनाने की यह technique क्या raylib जैसे दूसरे C frameworks पर भी लागू हो सकती है?
    और Termux के जरिए इस development system का इस्तेमाल करके, Android पर ही Android के लिए C development environment बनाया जा सकता है?

    • संभव है। raylib Android को support करता है
      मेरे raylib project में इस्तेमाल होने वाली थोड़ी अधूरी build script है
      जाहिर है signing को बेहतर तरीके से संभालना होगा, aarch64 के अलावा दूसरे targets भी build करना चाह सकते हैं, और SDK शायद /home/denis में installed न हो
      साथ ही .so file को apk में जोड़ने का तरीका modern Android की preferred way है या नहीं, यह पक्का नहीं है, लेकिन अभी भी काम करता है
      https://gist.github.com/deniska/f1ee73e18e1444eb724c01f933b6...
  • “Android के लिए” का मतलब है कि Java इस्तेमाल किया जा सकता है, और bytecode बहुत dense हो सकता है, इसलिए शायद इसे और छोटा बनाया जा सकता है

    • GameBoy के लिए Flappy Bird clone भी है, और यह 32KB ROM के रूप में है [0][1][2]
      इससे इस Android-based project को कमतर बताने का इरादा नहीं है। वैसे भी यह सबसे छोटा Flappy Bird clone बनाने का दावा नहीं कर रहा
      [0] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy/...
      [1] https://laroldsjubilantjunkyard.itch.io/flappy-bird-gameboy
      [2] https://www.youtube.com/watch?v=m839Vg_qXzM
    • सच कहूं तो 100KB का आंकड़ा चौंकाता है
      मन में लगता है कि इसे इससे काफी कम तक जाना चाहिए, और 10KB भी धुंधला-सा realistic लगता है