Skip to content

ऐसा web game बनाएं जो तेज़ी से लोड हो (एक प्रैक्टिकल चेकलिस्ट)

अगर players कुछ सेकंड में खेलना शुरू नहीं कर पाते, तो वे चले जाते हैं। यह tutorial एक प्रैक्टिकल चेकलिस्ट है जिसे आप लगभग किसी भी web game stack पर लागू कर सकते हैं (Canvas/WebGL/WebGPU, Pixi/Three/PlayCanvas, custom engine वगैरह)।

1) सबसे पहले budgets तय करें (वरना आप optimize नहीं कर पाएंगे)

ऐसे budgets चुनें जो आपके target device से मेल खाते हों। एक "instant play" अनुभव के लिए एक भरोसेमंद डिफ़ॉल्ट:

  • JS+CSS shipped: करीब 300–500 KB gzip से कम (जितना छोटा हो उतना बेहतर)
  • पहले input से पहले critical assets: करीब 2–5 MB compressed से कम
  • पहले input तक का समय: mid mobile पर करीब 3–5 सेकंड से कम

इन्हें लिख लें और इनके साथ API contracts जैसा बर्ताव करें।

2) सही चीज़ों को मापें

Chrome DevTools में:

  • एक session कैप्चर करने और long tasks जांचने के लिए Performance का इस्तेमाल करें।
  • इन्हें जांचने के लिए Network का इस्तेमाल करें:
    • transfer size बनाम decoded size
    • caching headers
    • assets प्रोग्रेसिव तरीके से stream होते हैं या एक बड़े blob के रूप में आते हैं

game के लिहाज़ से, इन्हें ट्रैक करें:

  • "player कब move कर सकता है" का समय
  • "पहला meaningful frame" का समय
  • "पहला input latency" (input → frame)

आपका "पहला input latency" वाला अंदाज़ा अब एक स्टैंडर्ड metric से मेल खाता है: मार्च 2024 में Interaction to Next Paint (INP) ने First Input Delay की जगह एक Core Web Vital के तौर पर ले ली, और यह सिर्फ़ पहले नहीं बल्कि सभी interactions में पूरे input-to-next-paint समय को मापता है। 75वें percentile पर INP को 200 ms से कम रखने का लक्ष्य रखें, जो उन responsiveness नंबरों के लिए एक काम का बाहरी बेंचमार्क है जिन्हें आप पहले से ट्रैक करते हैं।

3) जो कुछ भी compress हो सकता है उसे compress करें

पक्का करें कि आपकी hosting यह serve करती है:

  • text assets (JS/CSS/HTML/WASM) के लिए जहां उपलब्ध हो वहां Brotli (br)
  • फ़ॉलबैक के तौर पर gzip

अगर आपका host और CDN इसे सपोर्ट करते हैं, तो Zstandard (zstd) अब Content-Encoding के लिए एक तीसरा विकल्प है। यह Chrome और Edge 123+, Firefox 126+ और Safari 26.3+ में आता है (करीब 80% users), और यह कम server CPU खर्च पर Brotli जैसे ratios तक पहुंच सकता है, जो बड़े WASM और JSON payloads के लिए मददगार है। Browsers सिर्फ़ HTTPS पर ही Accept-Encoding: zstd बताते हैं, इसलिए बाकी सबके लिए Brotli और gzip को फ़ॉलबैक के तौर पर कॉन्फ़िगर रखें।

WebAssembly builds के लिए, अक्सर compression ही "instant" और "कभी लोड नहीं होता" के बीच का फ़र्क होता है।

4) पूरी दुनिया को शुरुआत में ही download न करें

अपने game को बांटें:

  • Boot: न्यूनतम loader + input + पहला scene
  • Core: मुख्य gameplay systems
  • Optional: अतिरिक्त levels, cosmetics, high-res textures, bonus audio वगैरह

"Optional" को सिर्फ़ तभी load करें जब:

  • player पहले से खेल सकता हो, और/या
  • आपको पता हो कि उसे वह content चाहिए (जैसे वह किसी menu/level तक पहुंच गया हो)

5) सही asset formats चुनें

ज़्यादातर web games के लिए:

  • Images: UI/backgrounds के लिए WebP को तरजीह दें (या AVIF अगर आप धीमे encode को बर्दाश्त कर सकते हैं)।
  • Audio: आम इस्तेमाल के लिए Ogg Vorbis को तरजीह दें; Apple ecosystems के लिए AAC टेस्ट करें।
  • Video: कम्पैटिबिलिटी के लिए MP4/H.264 को तरजीह दें, और जहां सपोर्ट हो और छोटा हो वहां WebM

decode cost पर नज़र रखें: "छोटा download" फिर भी "decode करने में धीमा" हो सकता है।

6) अपना पहला scene छोटा और deterministic रखें

अपने पहले interactive scene में इनसे बचें:

  • shader compilation storms
  • भारी texture uploads
  • procedural generation जो main thread को ब्लॉक कर दे
  • megabyte वाले blobs की synchronous JSON parsing

खासकर textures के लिए, PNG या JPEG के बजाय Basis Universal supercompression के साथ KTX2 ship करें। यह upload के बाद GPU-compressed बना रहता है (load पर desktop पर BC7 या mobile पर ASTC में transcode होकर), जिससे VRAM 4x से 8x घट जाता है और uploads पूरी साइज़ के PNG को decode करके raw pixels को GPU पर भेजने के मुक़ाबले कहीं सस्ते हो जाते हैं।

अगर आपको भारी काम करना ही है, तो उसे करें:

  • कई frames में थोड़ा-थोड़ा करके, या
  • एक Worker में (जब मुमकिन हो)

7) आक्रामक तरीके से cache करें (लेकिन सही तरीके से)

content-addressed assets के लिए लंबे समय तक टिकने वाली caching का इस्तेमाल करें:

  • Cache-Control: public, max-age=31536000, immutable

HTML entrypoints के लिए caching छोटी रखें ताकि आप updates सुरक्षित तरीके से deploy कर सकें।

8) "failure" को तेज़ और पढ़ने लायक बनाएं

अगर कुछ गड़बड़ हो, तो दिखाएं:

  • एक साफ़ error message
  • एक retry button
  • issue रिपोर्ट करने का एक link

खामोश failures भरोसे को खत्म कर देती हैं।

9) अगर आप Wasm threads इस्तेमाल करते हैं, तो COOP/COEP समझें

अगर आपका build SharedArrayBuffer पर निर्भर है (कुछ Wasm threading setups के लिए आम बात है), तो आपको शायद cross-origin isolation headers की ज़रूरत होगी:

  • Cross-Origin-Opener-Policy: same-origin
  • Cross-Origin-Embedder-Policy: require-corp

COEP header के लिए आपके पास दो विकल्प हैं। require-corp सख़्त विकल्प है लेकिन इसका मतलब है कि हर cross-origin asset (CDN textures, third-party scripts) को एक Cross-Origin-Resource-Policy header भेजना होगा वरना वह ब्लॉक हो जाएगा। Cross-Origin-Embedder-Policy: credentialless भी SharedArrayBuffer और cross-origin isolation को चालू करता है, लेकिन यह cross-origin resources को credentials के बिना load करता है, बजाय इसके कि उन्हें CORP के साथ opt in करना पड़े। अगर आप किसी ऐसे CDN से assets लाते हैं जो आपके कंट्रोल में नहीं है, तो credentialless आम तौर पर कम तकलीफ़देह रास्ता होता है।

अपने असली host पर जल्दी टेस्ट करें, क्योंकि headers और third‑party embeds चीज़ों को तोड़ सकते हैं।

10) इसे बिना किसी SDK के playable बनाएं

अगर आप Cinevva के creator workflow को target कर रहे हैं, तो इसका लक्ष्य रखें:

  • एक URL जो भरोसेमंद तरीके से boot हो
  • demo शुरू करने के लिए किसी ज़रूरी login की ज़रूरत न हो
  • अनुमान लगाने लायक input controls

फिर आप अतिरिक्त SDKs जोड़े बिना distribution के लिए तैयार हैं।

संबंधित: