3 पॉइंट द्वारा GN⁺ 2024-01-25 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Ctrl-Alt-Test टीम ने नवंबर 2022 से एक शॉर्ट animation जैसी दिखने वाली real-time demo को 8kB के भीतर समेटने का प्रयोग शुरू किया, और अप्रैल 2023 में The Sheep and the Flower रिलीज़ किया
  • नतीजे में बना एक single .exe बिना resource files या external dependencies के graphics और music generate करता है, और scenes GLSL shader व raymarching से GPU पर real-time में calculate होते हैं
  • भेड़, signboard, camera और timeline stored models या textures नहीं हैं, बल्कि SDF, procedural 3D textures और hardcoded time parameters से बनाए गए हैं; करीब 25 camera shots हाथ से adjust किए गए
  • Music OpenMPT और 4klang से बनाया गया, और compression efficiency बढ़ाने के लिए instruments की संख्या 16 से घटाकर 13 की गई और repetition बढ़ाया गया
  • अंतिम 8kB Crinkler compression और Shader Minifier improvements से संभव हुआ; 42kB shader code minify और compress होने के बाद करीब 5kB में फिट हो गया, जिससे music और C++ code के लिए जगह बची

8kB में समाया single executable

  • The Sheep and the Flower अप्रैल 2023 में रिलीज़ हुआ Windows executable format का real-time animation है
  • एक ही .exe file सब कुछ generate करती है, और अलग resource files या external dependencies नहीं हैं
    • चलाने के लिए Windows और latest drivers चाहिए
  • लक्ष्य था कि graphics, animation, direction, camerawork और music—सब कुछ 8kB के भीतर रखा जाए
  • Source code GitHub पर公開 किया गया: ctrl-alt-test/mouton

Graphics, music और compression में इस्तेमाल हुए tools

  • सभी visual elements GPU पर real-time calculate होते हैं
    • GLSL shader में timeline information, camera settings और scene representation तक शामिल हैं
    • Rendering raymarching से की जाती है
  • Shader को Shader Minifier से minify किया गया
  • Music OpenMPT और 4klang synthesizer से बनाया गया
    • Instruments procedural तरीके से describe किए गए हैं
    • Notes की list compress की गई है
  • Code Visual Studio 2022 में C++ से लिखा गया
  • Compiler flags और initialization की शुरुआत Leviathan framework के आधार पर हुई
  • Final executable को Crinkler से compress किया गया

8kB ही क्यों था

  • Demoscene में 4kB और 64kB जैसी size-limited categories आम हैं
  • पुराने काम मुख्य रूप से 64kB को target करते थे, लेकिन 8kB बिल्कुल अलग constraints और rules देता है
  • 4kB intro techniques रोचक हैं, लेकिन proper storytelling के लिए बहुत सीमित मानी गईं
  • Revision demoparty ने कुछ साल पहले 8kB competition category जोड़ी थी, और इसे experiment के लिए अच्छा मौका माना गया

दो triangles से दुनिया बनाना

  • Demoscene में 2008 के बाद से standard रूप से इस्तेमाल होने वाले तरीके की तरह, पूरी screen को cover करने वाला rectangle दो triangles से draw किया गया
  • इसी rectangle पर GLSL shader हर pixel और हर frame का color calculate करता है
  • Shader function coordinates और time input लेकर color return करता है
  • मुख्य चुनौती यह थी कि इसी function के भीतर भेड़ और पूरे scene को कैसे represent किया जाए

SDF से scene बनाना

  • Signed Distance Field (SDF) space के किसी point से सबसे नज़दीकी object तक की distance calculate करने वाला function है
    • Surface पर यह 0 return करता है
    • Object के अंदर यह negative value return करता है
  • Sphere या box जैसे basic shapes simple formulas से represent किए जा सकते हैं
  • कई distance fields को combine करके scene बनाया जाता है
    • दो objects का union distance के minimum value से बनाया जा सकता है
    • Intersection maximum value से बनाया जा सकता है
    • Smooth union इस्तेमाल करने पर ज्यादा organic shapes बन सकते हैं
  • भेड़ को cone और sphere जैसे simple shapes assemble और merge करके बनाया गया, और body व wool 3D noise function से बनाए गए

Raymarching से pixels तय करने का तरीका

  • Raymarching SDF का इस्तेमाल करके 3D scene में rays को थोड़ा-थोड़ा आगे बढ़ाने वाली rendering technique है
  • Traditional raytracing की तरह intersection point को mathematically सीधे calculate नहीं करती
  • SDF बताता है कि collision के बिना कितनी distance move किया जा सकता है, और ray को उतना आगे बढ़ाने की प्रक्रिया repeat होती है
  • Distance 0 या 0 के करीब हो जाने पर इसे intersection मिलना माना जाता है
  • Intersection होने पर पता चल जाता है कि current pixel भेड़, sky या किसी दूसरे object में से किससे संबंधित है
  • Lighting के लिए surface normal चाहिए होता है, और आसपास के gradient calculate करके normal estimate किया जाता है
  • Shadows intersection point से sun direction में एक और ray भेजकर और बीच में object है या नहीं, यह check करके calculate की जाती हैं

कम expressive power में कहानी सुनाने का तरीका

  • Demo में voice या text नहीं है, और character भी सिर्फ एक है
  • भेड़ केवल चलना, head और eye movement जैसी चीज़ें कर सकती है; rotate भी नहीं कर सकती
  • इन constraints में emotion convey करने के लिए कहानी से असंबंधित elements हटाए गए
    • शुरुआत में desert, sand dunes और sky सोचे गए थे, लेकिन उन्हें कहानी के लिए जरूरी नहीं माना गया
    • Background pure white रखा गया
    • Meaning convey करने वाले signboard और eyes को छोड़कर textures कम किए गए
  • Scope छोटा रखकर detail, polishing, camerawork, editing और music sync पर focus किया गया
  • हर shot हाथ से compose किया गया, और animation को flow natural लगे इसके लिए कई बार iterate करके adjust किया गया

Camera और direction

  • Camera को storytelling tool के रूप में इस्तेमाल किया गया
  • भेड़ के लंबे समय तक भटकने वाले scene में wide shot इस्तेमाल कर loneliness का भाव बनाया गया
  • Signboard notice करने के moment पर eyes का extreme close-up इस्तेमाल किया गया
  • जब भेड़ signboard को देखती है, तो focus बढ़ाने के लिए head की तरफ slow zoom-in किया गया
  • भेड़ की excitement कई expressions को layer करके convey की गई
    • Cartoon-like 2D effects
    • तेज़ हुई walk
    • Emphasized tail movement
    • Exaggerated head shaking
    • Music में dramatic change

तेज iteration के लिए development approach

  • Source code में बहुत सारे hardcoded constants हैं
    • भेड़ की eye size
    • Camera movement speed
    • हर shot की length
    • फूल के color जैसे values बार-बार adjust किए गए
  • Fast feedback के लिए shader को runtime पर फिर compile करके 1 second के भीतर graphics update किए गए
  • Animation और camera adjustment के लिए player की जरूरत थी
    • Pause
    • Play
    • Time control
    • Shader live reload के बाद तुरंत check करना
  • Music और animation को सही तरह sync करने के लिए music support भी जरूरी था
  • Initial prototype Shadertoy पर बनाया गया, और बाद में KodeLife के जरिए C++ project में ले जाया गया

4klang से बनाया गया music

  • Music storytelling का important element था, और कई moods व specific moments पर transitions चाहिए थे
  • 4kB intro में इस्तेमाल होने वाले tools को वैसे ही इस्तेमाल किया गया, लेकिन ज्यादा complex composition के लिए ज्यादा space allocate किया गया
  • 4klang synthesizer music software में इस्तेमाल होने वाला plugin देता है और assembly file export करता है
  • यह assembly file demo के साथ compile और link होती है
  • Demo चलते समय synth अलग thread में waveform sound procedural रूप से generate करके soundcard को भेजता है
  • शुरुआती music उम्मीद से बड़ा था, और size घटाने के लिए कई adjustments किए गए
    • Instruments की संख्या 16 से 13 की गई
    • Ending theme को पूरे music tempo के हिसाब से फिर compose किया गया
    • Compression बेहतर हो इसके लिए repetition बढ़ाया गया
    • Background sound की note length जैसे ऐसे changes से compression ratio सुधारा गया जिन्हें सुनकर मुश्किल से महसूस किया जा सके
  • Music की overall structure बनाए रखते हुए quality loss कम किया गया और space बचाई गई

Animation और time synchronization

  • Demo precomputation या cache के बिना हर frame में सब कुछ फिर evaluate करता है
  • Performance के लिए यह नुकसानदेह है, लेकिन animation के लिए अच्छा है क्योंकि कोई भी element time पर depend करके बदल सकता है
  • पूरा demo करीब 25 hand-crafted camera shots से बना है
  • हर shot describe करता है कि 18 parameters time के साथ कैसे बदलते हैं
    • हर object की position
    • भेड़ की state
    • Camera position
    • Focus
    • Camera किस target को देख रहा है आदि
  • उदाहरण के तौर पर camPos = vec3(22., 2., time*0.6-10.); की एक line से shot में camera की linear movement represent हो जाती है
  • time demo start के बाद का absolute time नहीं, बल्कि shot start के बाद का time है
    • Shot insert, delete या adjust करने पर बाकी demo पर असर कम पड़ता है
  • Simple linear interpolation mechanical लग सकता है, इसलिए कई cases में smoothstep इस्तेमाल किया गया
  • Timeline code vertex shader के भीतर है
  • Shot definitions में repetitive code ज्यादा है, लेकिन repetition compression के लिए helpful है

Textures और materials

  • Traditional renderer में 2D textures को 3D model surface पर लगाया जाता है
  • Raymarching approach में texture coordinates आसानी से calculate करना मुश्किल होता है, इसलिए इसके बजाय 3D texture को on the fly calculate किया जाता है
  • जब raymarcher render करने वाली 3D position ढूंढ लेता है, तो उस 3D coordinate को texture function में pass करता है
  • Traffic signboard में math से triangle या rectangle border बनाया गया, और inner content कई functions combine करके draw किया गया
    • Restaurant symbol 4 black oval shapes और grooves बनाने वाली 2 white shapes से बना है
  • Visual variety के लिए textures के साथ-साथ materials भी अलग set किए गए
    • उदाहरण के लिए भेड़ के hooves को Fresnel coefficient के जरिए अलग reflection देने के लिए process किया गया

आंखों को जीवंत बनाने वाले fake reflections

  • Development के दौरान लंबे समय तक आंखें lifeless और flat दिखती रहीं
  • Eyes character design और storytelling में important element थीं
  • Cartoon character reference images में iris बहुत दिखे, लेकिन जरूरी नहीं थे; pupils हमेशा बड़े draw किए जाने की tendency दिखी
  • चमकदार आंखें बनाने के लिए आंखों में light reflection चाहिए था
  • Existing lighting equation से reflection सिर्फ तब आता था जब sun और camera specific positions में होते थे
  • इसे compensate करने के लिए surface normal vector modify किया गया ताकि sun reflection आने की संभावना बढ़े
  • इसके अलावा environment mapping इस्तेमाल किया गया
    • आम तौर पर games में इसे real environment reflections को simplify करके optimize करने के लिए इस्तेमाल किया जाता है
    • यहां actual world लगभग पूरी तरह white है, लेकिन texture से fake detail जोड़ी गई
  • आंखों के white part और pupils में खाली world की तुलना में कहीं ज्यादा complex reflections हैं
    • कई fake light sources
    • Dark ground और blue sky imitate करने वाला gradient

Post-processing और visual style

  • Final mood और image quality को post-processing में refine किया गया
  • इस्तेमाल किए गए post-processing ये हैं
    • Color grading
    • Gamma correction
    • हल्की vignetting
    • Aliasing घटाने के लिए 2-pass FXAA filter
  • Eyes के star effect या ending screen effect जैसे कुछ effects भी post-processing stage में implement किए गए
    • ये effects pure 2D हैं और 3D world में मौजूद नहीं हैं
  • एक समय old cartoon-like style भी experiment किया गया
    • Hand-drawn जैसा दिखाने वाला outline detection
    • Black-and-white rendering
    • Grain और noise
  • चर्चा के बाद इस experiment को छोड़कर ज्यादा clean और modern look पर focus किया गया

Crinkler compression

  • Core idea data store करने के बजाय data generate करने वाला code store करने का है
  • Music में बजाए जाने वाले notes की list और हर instrument की command list store होती है
  • Crinkler demoscene और 1kB~8kB intros के लिए designed compression tool है
  • Executable को self-extracting होना चाहिए, इसलिए Crinkler में बाकी executable को unpack कर सकने वाला छोटा assembly code शामिल होता है
  • Crinkler size optimization को priority देता है
    • Compression algorithm time लेता है
    • Decompression relatively slow है
    • सैकड़ों MB RAM इस्तेमाल करता है
  • लेकिन Crinkler अकेला काफी नहीं था, और 42kB shader source code को executable में डालने के लिए additional minification चाहिए थी

Shader Minifier improvements

  • Shader source code final binary में शामिल होता है, इसलिए जितना हो सके छोटा होना चाहिए
  • इसे हाथ से minify किया जा सकता था, लेकिन maintainability और fast iteration में problem आती
  • Shader Minifier 2011 से develop हो रहा shader minification tool है
  • यह whitespace और comments हटाता है, variable names छोटा करता है, और और भी transformations करता है
  • 8kB intro में 4kB की तुलना में कहीं ज्यादा code शामिल था, जिससे नए problems आए; जरूरी features जोड़ने के लिए demo work एक महीने के लिए रोका गया
  • अच्छी minification के लिए simple minifier नहीं, बल्कि Closure Compiler जैसा source-to-source compiler चाहिए था
  • Shader Minifier जो transformations करता है, उनमें ये शामिल हैं
    • Variable और function names बदलना
    • Variable inlining
    • Constant arithmetic expressions evaluate करना
    • Function inlining
    • Dead code removal
    • Declarations merge करना
  • सिर्फ code size घटाना काफी नहीं था; output compression-friendly भी होना चाहिए था
    • कुछ transformations code size घटाते हैं, लेकिन compressed size बढ़ा सकते हैं
    • Demo को iteratively develop करते समय compressed size लगातार check करना पड़ता था
  • नए Shader Minifier improvements से compressed binary में करीब 600 bytes बचे
  • अंत में 42kB shader code minification और compression के बाद करीब 5kB में फिट हो गया
    • बची हुई जगह में music और C++ code आया

दूसरे कामों पर बनी यह उपलब्धि

  • यह demo raymarching techniques, music generation software और compression algorithms जैसे दूसरों के बनाए कामों पर बना है
  • Shader Minifier में जोड़े गए नए features आगे और बेहतर demos बनाने में मदद करेंगे, ऐसी उम्मीद है
  • 8kB category 4kB से ज्यादा possibilities देती है, और उम्मीद है कि यह और popular होगी
  • तुलना के लिए original text करीब 21,000 characters का है, और वैसे ही रखने पर 21kB चाहिए होते

1 टिप्पणियां

 
GN⁺ 2024-01-25
Hacker News की राय
  • मैं उस मूल फिल्म का निर्माता हूँ जिससे इस फिल्म ने प्रेरणा ली: https://www.youtube.com/watch?v=khWXdkryBE4
    मूल में सिर्फ Blender, SVG और audio files ही MB स्तर की थीं, इसलिए यह वाकई प्रभावशाली है कि remake 8kB के भीतर आ गया
    यह देखकर अच्छा लगा कि Creative Commons license वास्तव में काम आया, हालांकि अगर वही hedgehog character और audio melody भी इस्तेमाल की जाती तो और अच्छा लगता

  • Sloot फिर से ज़िंदा हो गया!!!
    https://en.m.wikipedia.org/wiki/Sloot_Digital_Coding_System

    • Sloot शायद न चले, लेकिन नीचे दिया गया compression algorithm पूरी फिल्म को कुछ kB में समेटने में काफ़ी प्रभावी था
      बहुत सारे demosceners को इकट्ठा करो, उन्हें फिल्म दिखाओ, और कुछ समय के लिए उन्हें कंप्यूटर वाले कमरे में बंद कर दो
      बड़ा screen, बड़ा sound system, beer और junk food हो तो यह और बेहतर काम करता है, और अंत में result executable मिल जाता है
    • वह तो कुछ भी नहीं है। मैं Shakespeare की संपूर्ण रचनाएँ प्रिंट करने वाला 1-byte program पेश करता हूँ:
      a
      performance के लिए Rust में लिखा गया interpreter a command को evaluate करते समय runtime में शामिल एक specific payload को STDOUT पर प्रिंट करता है
    • “1999 में, अपने invention की बिक्री के contract पर हस्ताक्षर होने से कुछ दिन पहले, Sloot की अचानक heart attack से मृत्यु हो गई। source code बरामद नहीं हुआ, और उस तकनीक व दावों को कभी पुनरुत्पादित या सत्यापित नहीं किया गया”
      यह सच में सबके लिए बहुत ही बुरी किस्मत थी
    • लेख को सरसरी तौर पर पढ़कर मेरी त्वरित व्याख्या यह है कि उसने hash algorithm को non-technical लोगों को गलत तरह से समझाया था
      शायद वे लोग a) यह नहीं समझे कि यह one-way function है, और b) यह भी नहीं समझे कि अगर one-way न भी हो, तब भी कई inputs एक ही hash पर map हो सकते हैं
  • demoscene videos काफ़ी मज़ेदार हैं, लेकिन हद से ज़्यादा कम-ज्ञात हैं
    https://www.youtube.com/playlist?list=PLRQwR4-_0PR9HBI_GZs1nTn7q5LTkGeCN
    काश कोई ऐसा channel हो जो retro game mechanics की तरह अच्छे visuals के साथ इनके अंदरूनी हिस्से समझाए

    • demos को YouTube videos के रूप में देखना थोड़ा cheating जैसा लगता है, लेकिन 20 साल पहले की तुलना में अब random executables डाउनलोड करके चलाने में ज़्यादा सावधानी बरतता हूँ, इसलिए अच्छा है कि videos मौजूद हैं
      जब videos नहीं होते थे, तब decompress और processing का काफ़ी इंतज़ार करने के बाद ही पता चलता था कि प्रभावित होना है या निराश
      पहले मैं breaks में बहुत demos देखता था, और वे उस समय की मानसिक अवस्था के लिए एकदम सही background थे
    • लगता है यह मेरा all-time favorite demo साझा करने का मौका है। Still का Intrinsic Gravity: https://youtu.be/-ZxPhDC-r3w
    • सहमत हूँ। अगर .kkrieger जैसी चीज़ों की internal structure देख पाते, तो वह कमाल होता
      https://en.wikipedia.org/wiki/.kkrieger
    • अगर हम AGI को सुलझा लें, तो मैं intelligence के लिए demoscene देखना चाहूँगा। इसे कितना compress किया जा सकता है?
      और आगे बढ़कर, intelligent agents से भरी दुनिया को कितना छोटा बनाया जा सकता है?
      परिशिष्ट: downvote करने वालों, क्या तुम सपने नहीं देखते? आगे सचमुच पागलपन की हद तक शानदार चीज़ें आने वाली हैं
    • shader wars याद आ गया
  • मुझे पता है कि बाद की तकनीक काफ़ी अलग है, लेकिन इससे पुराने .kkrieger की याद आ गई। पूरे 3D FPS को 96k में समेट दिया था, जो वाकई शानदार था
    https://en.m.wikipedia.org/wiki/.kkrieger

  • अगर आप demoscene बहुत देखें और यह पढ़ें कि वे कैसे बनाए जाते हैं, तो सीमाएँ समझ में आने लगती हैं, और यह साफ़ दिखता है कि भेड़ जैसी चीज़ें, खासकर पैरों के conic sections, बहुत संक्षिप्त equations में व्यक्त की जा सकती हैं और उसी तरह animate भी की जा सकती हैं
    लेकिन जहाँ तक मुझे पता है, ज़्यादातर demos GPU और शक्तिशाली 3D acceleration पर निर्भर करते हैं, जबकि 2D जापानी anime-शैली के demos छोटे आकार में दुर्लभ या लगभग न के बराबर लगते हैं
    क्या वास्तव में 3D animation आसान है?
    और हाँ, “mouton” फ़्रेंच में “sheep” होता है, इसलिए “mutton”

    • आपका वर्णित तरीका ही शायद दिखाता है कि demos में 3D आम क्यों है। 3D geometry को closed-form equations के रूप में व्यक्त किया जा सकता है, जिनके लिए बहुत कम storage space चाहिए
      दूसरी ओर, 2D style animation को स्टोर करने का ‘mathematical’ तरीका शायद outlines को SVG curves के रूप में स्टोर करना और क्षेत्रों को भरने के लिए flood-fill algorithm जैसा कुछ इस्तेमाल करना होगा
      मोटे हिसाब से देखें तो curve का एक single arc या line भी उतनी storage ले सकता है जितनी पूरी geometric volume के वर्णन में लगती है, और उन curves की animation को स्टोर करने में 3D volume के छोटे transformation matrices की तुलना में कहीं ज़्यादा जगह लगेगी
      rendering algorithm की complexity भी वास्तविक algorithmic complexity और space complexity, दोनों में बढ़ती दिखती है
      caveat: कई bitmaps स्टोर करके उन्हें flipbook की तरह चलाना भी ‘mathematical’ कहा जा सकता है, अगर आप किसी procedural decompression algorithm का उपयोग करें जो diffs से पूरे frames बनाता हो
      लेकिन मुझे नहीं लगता कि ऐसा तरीका मौजूद है, और 3D volume के वर्णन की तुलना में इसकी space requirements बहुत बड़ी होंगी
    • ज़्यादातर 2D animation भी आखिरकार 3D space में होने वाली घटनाओं का ही चित्रण करते हैं, इसलिए सामान्य रूप से 3D events को सीधे describe करना कहीं आसान होगा
  • यह 8kB से थोड़ा बड़ा है, लेकिन अगर आपको भेड़ों पर बनी अप्रत्याशित रूप से dark animation पसंद है, तो Blender Foundation की open movie Cosmos Laundromat की सिफारिश करता हूँ
    इस foundation की फिल्में tech demos के हिसाब से हमेशा कुछ अजीब तरह से dark रहती हैं, और मुझे लगा यह खास तौर पर बहुत अच्छी बनी थी
    [0] https://www.youtube.com/watch?v=Y-rmzh0PI3c

  • पहले से चेतावनी दे दूँ: फ़िल्म का अंत “to be continued” पर होता है, और Wikipedia पेज पर यह लिखा है:
    “यह फ़िल्म मूल रूप से एक फीचर-लेंथ फ़िल्म की शुरुआत के रूप में बनाई गई थी। इस शॉर्ट के सीक्वल के लिए स्क्रिप्ट और डिज़ाइन मौजूद थे, लेकिन प्रोडक्शन शुरू नहीं हो सका। 2020 में [निर्माता] ने घोषणा की कि यही एक फ़िल्म इस प्रोजेक्ट का पूरा रूप रहेगी”
    अगर आप किसी दिलचस्प कॉन्सेप्ट का अंत कभी न देख पाने वाली निराशा से बचना चाहते हैं, तो इसे छोड़ देना बेहतर हो सकता है

    • इससे जुड़ी एक अतिरिक्त बात यह है कि Netflix की वजह से पूरी फ़िल्म 18,192 uncompressed EXR images की सीक्वेंस के रूप में S3 से डाउनलोड के लिए उपलब्ध कराई गई है
      DaVinci Resolve में HDR एक्सपेरिमेंट करते समय यह उपयोगी रही
      [1] https://opencontent.netflix.com/#h.uyzoa2bivz2j
    • “अजीब तरह से अंधेरा” शायद डच हास्यबोध को काफ़ी अच्छी तरह बयान करता है, और संभवतः मुख्य वजह भी वही है
  • 8KB demoscene की एक श्रेणी है। Pouet पर ऐसी कृतियों का अच्छा-खासा इंडेक्स है
    0. https://www.pouet.net/prodlist.php?type%5B%5D=8k&page=1

    • इस पोस्ट में जिस कृति का ज़िक्र है, वह दूसरे स्थान पर रही, और अगर जिज्ञासा हो तो पहला स्थान यहाँ है: https://www.pouet.net/prod.php?which=94143
  • Razor 1911. शुद्ध नॉस्टैल्जिया

    • यह समूह warez, cracking, और FILE_ID.DIZ तथा .nfo फ़ाइलों की ASCII art के लिए सबसे ज़्यादा जाना जाता है
      इससे दशकों पुराने कई अच्छे दिनों की यादें ताज़ा हो गईं :-)
    • यह देखकर अच्छा लगा कि वे अब भी कहीं न कहीं शानदार कला बना रहे हैं
  • यह सचमुच हैरान करने वाला है, और मुझे यह बहुत पसंद आया कि सीमाओं के बावजूद कहानी इतनी मज़ेदार और रचनात्मक है। वास्तव में प्रभावशाली
    मैं तकनीकी डिटेल्स के बारे में और सुनना चाहूँगा कि bytes बचाने के लिए किस तरह की तरकीबें और कटौतियाँ की गईं

  • मज़ेदार भी और पूरी तरह चौंकाने वाला भी। आख़िरकार मैंने ऐसी फ़िल्म देखी जिसका अंत मैं बिल्कुल predict नहीं कर पाया