14 पॉइंट द्वारा GN⁺ 2025-12-30 | 13 टिप्पणियां | WhatsApp पर शेयर करें
  • Unity द्वारा इस्तेमाल किया जाने वाला Mono runtime नवीनतम .NET की तुलना में काफ़ी धीमी execution speed दिखाता है, और एक ही C# कोड में अधिकतम 15 गुना तक का अंतर देखा गया है
  • वास्तविक game code में Mono-आधारित Unity execution 100 सेकंड और उसी कोड की .NET execution 38 सेकंड मापी गई, जिससे debugging और testing efficiency पर बड़ा असर पड़ता है
  • Release mode में भी Mono 30 सेकंड और .NET 12 सेकंड पर रहा, यानी optimized environment में भी 2.5 गुना से अधिक performance gap बना रहता है
  • इसकी वजह Mono का अप्रभावी JIT compilation और inlining failure, ज़रूरत से ज़्यादा memory copy आदि हैं, जो .NET की आधुनिक CoreCLR JIT optimization से स्पष्ट रूप से पीछे हैं
  • अगर Unity CoreCLR-आधारित .NET modernization पूरा कर लेता है, तो game और editor दोनों में बड़ा performance improvement संभव है, और इससे सभी Unity projects पर लगने वाला छिपा performance tax हट सकता है

Unity में Mono इस्तेमाल होने की पृष्ठभूमि

  • Unity 2006 से C# कोड चलाने के लिए Mono framework का इस्तेमाल कर रहा है
    • उस समय Mono ही एकमात्र multi-platform .NET implementation था, और open source होने के कारण Unity उसमें बदलाव कर सकता था
  • 2014 के बाद Microsoft ने .NET Core को open source किया, और 2016 में .NET Core 1.0 जारी किया
    • इसके बाद Roslyn compiler, नया JIT, performance improvements आदि के साथ .NET ecosystem तेज़ी से आगे बढ़ा
  • 2018 में Unity engineers ने बताया था कि वे CoreCLR porting पर काम कर रहे हैं, और Mono की तुलना में 2 से 10 गुना performance improvement की उम्मीद है
  • लेकिन 2025 के अंत तक भी CoreCLR-आधारित game execution संभव नहीं है

Mono और .NET के बीच performance gap

  • Unity project के simulation code को Unity के बाहर .NET पर चलाकर सीधी तुलना की गई
    • Unity/Mono environment: 100 सेकंड, .NET environment: 38 सेकंड (Debug mode के आधार पर)
  • Release mode में Mono 30 सेकंड और .NET 12 सेकंड रहा, यानी अंतर बरकरार है
    • .NET, 4K×4K map को 3 सेकंड के भीतर generate कर देता है, जो इसकी multithread optimization क्षमता दिखाता है
  • Mono का अप्रभावी code generation एक बड़ी वजह है, और साधारण loop में भी 15 गुना speed difference देखा गया

Assembly तुलना: Mono vs .NET

  • एक ही test code से बने x64 assembly की तुलना में पाया गया कि
    • .NET JIT loop invariants को loop के बाहर ले जाता है (hoisting) और केवल न्यूनतम register operations करता है
    • Mono दर्जनों mov instructions के साथ memory copy दोहराता है, और अप्रभावी inlining के कारण performance गिरती है
  • int.MaxValue repeat loop execution time
    • .NET: 750ms, Mono: 11,500ms, Unity Editor(Debug): 67,000ms
  • Mono loop के भीतर अनावश्यक memory move और comparison operations बार-बार चलाता है

CoreCLR अपनाने का महत्व

  • CoreCLR आधुनिक JIT, Span<T> API, SIMD optimization, hardware instruction support जैसी modern capabilities देता है
    • इनसे अतिरिक्त 2 गुना या उससे अधिक performance improvement की संभावना है
  • Unity का Burst compiler LLVM-आधारित native code बनाता है, लेकिन इसमें C# feature limitations हैं
    • CoreCLR का modern JIT, Burst जैसी performance दे सकता है और इसमें language restrictions कम हैं
  • CoreCLR, AOT (ahead-of-time compilation) support भी देता है, जिससे startup speed improvement और JIT-सीमित platforms (जैसे iOS) के लिए समर्थन संभव है
    • फिर भी Unity ने अभी IL2CPP बनाए रखने की नीति बताई है

निष्कर्ष: Unity को .NET modernization की ज़रूरत

  • Mono, आधुनिक .NET की तुलना में 1.5 से 3 गुना या उससे अधिक धीमी execution performance दिखाता है, और यह सभी Unity projects पर एक छिपी हुई लागत की तरह असर डालता है
  • CoreCLR आने पर संभावित लाभ
    • runtime performance improvement, तेज़ iterative builds, GC improvement, domain reload हटना, managed code usage बढ़ना
  • Unity 6.x roadmap में .NET Modernization शामिल है, लेकिन यह 2026 के बाद के लिए निर्धारित है
  • CoreCLR support पूरा होने पर Unity developers और players दोनों को वास्तविक performance transformation मिल सकता है
  • फिलहाल Mono की सीमाएँ पूरे Unity ecosystem की performance bottleneck बनी हुई हैं

13 टिप्पणियां

 
dunward 2026-01-05

Unity से जुड़ा लेख देखकर बहुत खुशी हुई।
अच्छी तरह पढ़ा।

 
mhcoma 2025-12-30

अगर इसे सफलतापूर्वक अपनाया गया, तो लगता है कि बहुत-से indie game optimization शायद बेहतर हो जाएंगे...

 
rkttu 2025-12-30

मुझे लगता है कि Mono को ज़रूर CoreCLR में आधुनिक बनाया जाना चाहिए, इसका एक और कारण यह है कि Unity के पास Mono की performance सुधारने में निवेश करने की न तो पर्याप्त स्थिति है और न ही खास इच्छा। मेरा मानना है कि .NET Framework दौर की विरासत को जितनी जल्दी हो सके समेट देना सही होगा. :-D

 
rkttu 2025-12-30

और मुझे लगता है कि .NET 10 के संदर्भ में यह बात भी ध्यान में रखी जानी चाहिए कि जिन समस्याओं को वे पहले IL2CPP के ज़रिए हल करना चाहते थे, वे अब अलग दिशा में सही तरह से addressed हो रही हैं (Native AOT)।

बेशक, इसकी सीमा यह है कि बीच में edit किए जा सकने वाला C++ code तैयार नहीं होता, लेकिन नतीजे के तौर पर Just-In-Time के बिना native binary production, .NET 8 से शुरू होकर .NET 10 तक आते-आते और अधिक परिपक्व हो गया है.

इसी वजह से, CoreCLR के साथ modernization को लगातार टालते रहना Unity के लिए अच्छा विकल्प नहीं होगा, ऐसा मुझे लगता है. या फिर पूरी तरह किसी अलग भाषा या आधार पर switch करना भी शायद अधिक प्रभावी replacement हो सकता है!

 
sonohoshi 2025-12-30

Unity के पास Mono की performance सुधारने में निवेश करने की न तो पर्याप्त स्थिति है और न ही खास इच्छा।

इस बात से भी मैं पूरी तरह सहमत हूँ...

 
GN⁺ 2025-12-30
Hacker News टिप्पणियाँ
  • एक पेशेवर गेम डेवलपर के तौर पर मैं आमतौर पर Unity से जुड़ी चर्चाओं में हिस्सा नहीं लेता, लेकिन यह विषय सीधे मेरे विशेषज्ञता क्षेत्र से जुड़ा है, इसलिए अपनी राय दे रहा हूँ
    लेख में कुछ हिस्से ऐसे लगे जैसे उन्हें किसी ऐसे व्यक्ति ने लिखा हो जिसे Unity डेवलपमेंट का कम अनुभव हो
    1. simulation और presentation layers को अलग करना पुराने समय से इस्तेमाल होने वाला आम performance optimization तरीका रहा है (पहले इसे ज़्यादातर C++ में लागू किया जाता था)
    2. ज़्यादातर गेम Mono backend नहीं बल्कि IL2CPP के साथ रिलीज़ होते हैं
    3. आधुनिक Unity में performance के लिए Burst Compiler और HPC# का इस्तेमाल सामान्य है. Job System बहुत मदद करता है
    4. editor में profiling करना लगभग बेकार है, क्योंकि वह debug build से भी काफ़ी धीमा होता है
      संक्षेप में, Unity डेवलपर्स इस अपडेट को performance boost से ज़्यादा modern language features तक पहुंच के लिए लेकर उत्साहित हैं. और runtime के दौरान GC को न्यूनतम रखना या unmanaged memory और DOTS के जरिए उससे बचना आम बात है
    • लगता है कि आप Unity की marketing से कुछ ज़्यादा प्रभावित हो गए हैं. Unity हमेशा समस्या-ग्रस्त सिस्टम को थोड़ा-थोड़ा सुधारने वाले तरीके से काम करता है
      IL2CPP बस .NET IL को C++ में बदलने वाला एक कमज़ोर code generator है, जो optimization compiler पर निर्भर करता है
      यह बात Unity ब्लॉग की IL2CPP internals पोस्ट से देखी जा सकती है
      Burst/HPC# भी ECS या SoA जैसे ट्रेंड्स का पीछा करते हैं, लेकिन performance अच्छी तरह लिखे गए C++ या CoreCLR C# से कम रहती है
      ऊपर से ये तकनीकें closed और Unity-specific हैं, इसलिए बाहर इस्तेमाल नहीं की जा सकतीं. Unity हमेशा धीमे Mono के मुकाबले benchmark दिखाकर marketing करता है
      आखिरकार Unity को भी CoreCLR अपनाना पड़ेगा, और तब उसे समझ आएगा कि उसकी मौजूदा जटिल codebase से साधारण C# code ज़्यादा तेज़ हो सकता है
    • लेखक के तौर पर आपकी राय के लिए धन्यवाद. हमारा गेम इस तरह बना है कि वह Unity types या DLLs पर बिल्कुल निर्भर नहीं करता, इसलिए सामान्य Unity गेम से अलग है
      हम IL2CPP का इस्तेमाल नहीं करते क्योंकि वह runtime DLL loading, reflection, FieldOffset struct packing जैसी चीज़ों के साथ compatible नहीं है
      modders IL injection के जरिए functionality बढ़ा सकते हैं, जिससे कुल मिलाकर development speed तेज़ हो जाती है
      Burst और HPC# हमें उनकी जटिलता और सीमाओं के कारण पसंद नहीं हैं. Mono और .NET के performance gap की वजह से यह और भी निराशाजनक है
      editor profiling भी उपयोगी रही, क्योंकि उसने real build के समान अनुपात में performance improvement दिखाया. हालांकि Unity का default profiler सटीक नहीं था, इसलिए हमने खुद का tracing system इस्तेमाल किया
      GC अब भी समस्या है. string handling और UI हर frame में garbage बनाते हैं. CoreCLR पर जाने से बेहतर APIs और moving GC के कारण memory fragmentation की समस्या कम हो सकती है
  • Unity में शुरुआत करना आसान है, लेकिन इसकी monolithic structure की वजह से technical debt बहुत ज़्यादा है
    Asset Store शानदार है, लेकिन engine खुद अभी भी अधपका सा लगता है.
    Mono-based scripting को CoreCLR में ले जाना संरचनात्मक रूप से जटिल है
    अगर Unity सच में अपने core को सुधारना चाहता है, तो उसे Blender 3.x की तरह पूरे editor को redesign करना होगा
    अभी यह 1999 के UI जैसा महसूस होता है
    • Unity की सबसे बड़ी समस्या यह है कि वह नई features को पूरा किए बिना छोड़ देता है
      अनगिनत plugins और tools “0.x-preview” स्टेज पर अटके रहते हैं, और 5~10 साल बाद या तो चलते नहीं हैं या नई assets के नीचे दब जाते हैं
      इसलिए अब मैं सिर्फ 1.0 या उससे ऊपर के version ही इस्तेमाल करता हूँ. नहीं तो छोड़े गए plugin पर निर्भरता बन जाती है और अंत में फिर से port करना पड़ता है
      इससे Unity, डेवलपर और यूज़र—सभी का नुकसान होता है
    • Unity एक ऐसी कंपनी लगती है जिसने अपनी दिशा खो दी है
      अंदरूनी तौर पर अपने गेम डेवलपमेंट की असफलताओं के कारण उसमें वास्तविक गेम बनाने की समझ की कमी दिखती है
      वह सिर्फ मांगे गए features जोड़ती है, लेकिन एकसमान vision नहीं है
    • WebGPU, Vulkan जैसी एक abstraction layer है
      अगर performance ज़रूरी है तो Vulkan को सीधे call करना बेहतर है, और अगर portability ज़रूरी है तो WebGPU इस्तेमाल करना चाहिए
      अलग-अलग browsers में implementation अलग होने से overhead आता है, लेकिन अगर OS driver स्तर पर WebGPU मिले तो यह समस्या हल हो सकती है
    • Unity में कुछ भी करना हो तो हमेशा workaround ढूँढ़ना पड़ता है
      जबकि Godot सरल और सार्थक building blocks देता है, जिनसे आप अपनी पसंद की चीज़ें स्वतंत्र रूप से बना सकते हैं
    • Unity अक्सर अपने ही features के APIs तोड़ देता है, जिससे tutorials तक काम नहीं करते
      Asset Store में भी version compatibility की समस्याओं के कारण maintenance मुश्किल हो जाती है, और ज़्यादातर चीज़ें छोड़ी हुई assets बनकर रह जाती हैं
      Unity जब किसी उपयोगी asset को खरीदता है, तो उसे ठीक से integrate भी नहीं करता, और competing assets गायब हो जाते हैं
      जबकि Unreal Engine ऐसी सुविधाएँ engine-built-in स्तर पर देता है
  • Unity का GC Boehm GC इस्तेमाल करता है, इसलिए वह .NET या Mono से काफ़ी धीमा है
    Unity की IL2CPP में बेहतर GC लाने की भी कोई योजना नहीं दिखती
    CoreCLR-based editor आने पर शायद editor build से भी तेज़ हो सकता है
    संबंधित चर्चा: Unity CoreCLR और .NET modernization
    • GC का बेहतर होना अच्छी बात है, लेकिन गेम्स में प्रति frame allocation को 0 पर रखना उससे भी ज़्यादा महत्वपूर्ण है
      अगर incremental GC ठीक से काम करे, तो stutter की समस्या भी बहुत बड़ी नहीं रहती
    • CoreCLR migration के दौरान domain reload हटने से editor speed काफ़ी बढ़ेगी
    • Mono में पहले से precise GC है, फिर भी Boehm क्यों इस्तेमाल हो रहा है यह समझ नहीं आता
  • जब Unity ने 2018 में CoreCLR porting पर चर्चा शुरू की थी, तभी से यह लंबी यात्रा रही है
    C# खुद बहुत तेज़ हो चुका है, इसलिए Unity को इस transition पर अपनी पूरी क्षमता केंद्रित करनी चाहिए
    हमारी टीम को .NET Framework 4.7.2 से .NET 6 पर जाने में कुछ महीने लगे, और उसके बाद LTS upgrades कुछ घंटों का काम रह गए
  • लगता है Unity के पास अब CoreCLR migration करने की तकनीकी क्षमता नहीं बची
    लगातार देरी हो रही है, और leaders जा रहे हैं
    विकल्प के तौर पर .NET 10 आधारित Stride engine की सिफारिश है. इसमें Unity जैसी boundary overhead नहीं है
    • प्रगति धीमी है, लेकिन Unity वास्तव में CoreCLR transition आगे बढ़ा रहा है
    • Stride, Unity की features का सिर्फ एक हिस्सा देता है
      Godot open source है, लेकिन उसका C# support अस्थिर है, और अगर Web build काम न करे तो वह game jam के लिए उपयुक्त नहीं है
      GPU support के साथ एक वास्तविक sandbox solution की ज़रूरत है
    • यह technical skill की कमी नहीं, बल्कि resources और leadership की समस्या है
      priorities लगातार बदलती रहती हैं, requirements संशोधित होती रहती हैं, और काम बार-बार दोहराना पड़ता है
      डेवलपर्स अब भी प्रतिभाशाली हैं, लेकिन सतत execution की कमी है
    • Unity द्वारा खरीदी गई कई technologies और add-ons को हटाने या integrate करने का बोझ बहुत बड़ा है
      ऐसे बड़े rewrite, CEO के नज़रिए से भी उच्च जोखिम वाला फैसला होते हैं
  • मैंने Rec Room का Circuits system डेवलप किया था, और Unity dependency हटाकर उसे CoreCLR पर testable बनाने का अनुभव है
    नतीजतन performance काफ़ी बेहतर हुई, और engine dependency कम होने से code maintenance भी आसान हो गया
    Unity concepts को सिर्फ वहीं expose करके जहाँ ज़रूरी था, और tests के जरिए boundaries enforce करके मैंने logical separation की value को गहराई से महसूस किया
  • मैं जानना चाहता हूँ कि लेखक IL2CPP की जगह Mono क्यों इस्तेमाल कर रहा है. IL2CPP काफ़ी तेज़ है, इसलिए Mono build पुराना तरीका माना जाता है. अगर performance महत्वपूर्ण है, तो IL2CPP पहला कदम होना चाहिए
  • मेरा सपना है कि मैं .NET SDK को सीधे Android फोन पर install करूँ और उसे native तौर पर चलाऊँ
    अगर root access हो, और उसे WireGuard या Tailscale जैसे network tools के साथ जोड़ा जाए, तो वह portable server के रूप में भी शानदार होगा
    .NET 10 के नए GC से गेम stutter भी लगभग खत्म हो जाएगा
    अभी मैं अपने मुख्य PC से Sunlight + Moonlight के जरिए गेम stream करके फोन पर खेलता हूँ
    high-refresh-rate OLED स्क्रीन की वजह से battery usage भी कम रहता है
    • root restrictions security reasons की वजह से हैं. सार्वजनिक जगहों के USB ports से infection रोकने के लिए rooting को मुश्किल बनाया गया है
    • MAUI(Xamarin) से कुछ वैसा ही किया जा सकता है
      यह .NET SDK नहीं है, लेकिन Mono runtime app में bundled रहता है, इसलिए अनुभव लगभग वैसा ही लगता है
  • यह समझ नहीं आता कि Unity अब तक पूरी तरह .NET पर क्यों नहीं गया
    Mono के cross-platform फायदे अब लगभग खत्म हो चुके हैं, फिर भी IL2CPP जैसी जटिल hack को बनाए रखना अजीब है
    • sunk cost fallacy बहुत बड़ी है. Mono, IL2CPP, Burst आदि में पहले ही भारी निवेश हो चुका है, इसलिए दिशा बदलना मुश्किल है
    • Unity ने Mono को बहुत गहराई से customize किया है, इसलिए उसे बस बदल देना आसान नहीं है
      वर्षों से non-standard modifications जुड़ती गई हैं, और किसी बहुत बड़ी कंपनी के बिना उसे फिर से optimize करना भी कठिन है
  • हैरानी होती है कि Unity ने 2018 से CoreCLR transition शुरू किया और अब तक पूरा नहीं कर पाया
    मुझे लगता है कि इस स्तर के प्रोजेक्ट के लिए 1~2 साल काफ़ी होने चाहिए थे
 
quack337 2025-12-31

आह... लगता है Mono अभी भी legacy .NET framework पर आधारित है...
यह गेम नहीं है, लेकिन मैं लगभग 1 लाख लाइनों वाले .NET4.8 + LINQ to SQL + WinForm financial app को .NET10 + Entity Framework पर migrate कर रहा हूँ, और यह स्पष्ट रूप से कहीं ज़्यादा तेज़ महसूस होता है। जो calculation task पहले 10 सेकंड लेता था, वह घटकर 3 सेकंड तक आ गया है!

 
intajon 2025-12-30

अगर NuGet compatibility भी जोड़ दें तो अच्छा होगा (या शायद मुझे Unity की ज़्यादा समझ नहीं है?)

 
sonohoshi 2025-12-31

आधिकारिक सपोर्ट तो नहीं है... लेकिन NuGetForUnity नाम का एक open source विकल्प मौजूद है।

 
rkttu 2025-12-30

सिद्धांत रूप में देखें तो .NET Standard 2.0 को target करने वाले Nuget packages को Unity environment में भी import करके इस्तेमाल किया जा सकता है.. लेकिन लगता है कि व्यावहारिक असुविधाएँ काफ़ी हैं.

https://learn.microsoft.com/ko-kr/dotnet/…

 
sonohoshi 2025-12-30

बात तो सही है, लेकिन खास तौर पर editor performance की तुलना करने की वजह समझ नहीं आ रही... कम से कम debug build के साथ ही तुलना करके लाते? या नहीं, फिर शायद उसकी विश्वसनीयता और गिर जाती? दूसरी तरफ देखें तो IL2CPP हो या Mono, दोनों ही किसी न किसी तरह से पुराने पड़ चुके तकनीक लगते हैं।

 
foriequal0 2025-12-30

बड़े प्रोजेक्ट्स में editor performance डेवलपमेंट अनुभव को काफ़ी कमज़ोर कर देती है, इसलिए editor performance भी मायने रखती है. Editor खुलने में धीमा है, asset import भी धीमा है, और debugging/testing loop भी धीमा है...

 
sonohoshi 2025-12-30

आह... हाँ, बेशक यह भी महत्वपूर्ण है। जब मैंने इसे पहली बार पढ़ा था, तो मुझे लगा कि लेख का लेखक शायद कोड execution speed के कुछ अधिक मूलभूत पहलू पर बात करना चाहता था। जैसा आपने कहा, यह भी सच है कि Unity का editor धीमा है, import भी धीमा है, और कुल मिलाकर test loop भी धीमा है...