معرفی
Web Adaptive Performance (WebAP) ابزاری برای بهینهسازی پویای برنامههای Unity WebGL است.
این ابزار به یافتن تعادل بین کیفیت بصری و FPS پایدار در طیف وسیعی از دستگاهها، از رایانههای شخصی قدرتمند تا گوشیهای هوشمند ضعیف، کمک میکند. بهجای تکیه بر محدودیتهای سخت، این افزونه زمانبندی فریمها را در لحظه تحلیل میکند. این افزونه علت اصلی افت عملکرد را تشخیص داده، بار را بهآرامی تا رسیدن به پایداری کاهش میدهد و در صورت بهدست آوردن حاشیه عملکرد (Performance Headroom)، کیفیت را بازیابی میکند.
تطبیق با دستگاه
پروژه Unity خود را بهطور پیشفرض برای تنظیمات حداکثر کیفیت پیکربندی کنید. اگر دستگاه فعلی نتواند آن بار را تحمل کند، افزونه بهطور خودکار آن را در حین اجرا (Runtime) کاهش میدهد.
چرا WebAP را انتخاب کنیم؟
چرا از پکیج رسمی Adaptive Performance استفاده نکنیم؟
پکیج رسمی Unity ابزاری قدرتمند است، اما با WebGL سازگاری اساسی ندارد. این پکیج بر دو نوع ارائهدهنده (Provider) تکیه دارد که هر دو با محدودیتهای مرورگر متوقف میشوند:
۱. ارائهدهندگان بومی (Native Providers) (Android): برای بازیابی دادههای حرارتی و مدیریت فرکانس به APIهای سیستم وابسته هستند. سندباکس (Sandbox) مرورگر از هرگونه دسترسی به سختافزار جلوگیری میکند و این رویکرد را غیرممکن میسازد. استانداردهای جدید وب (مانند Compute Pressure API) تنها CPU را مانیتور میکنند و دادههای دقیقی برای گرافیک سهبعدی ارائه نمیدهند.
۲. ارائهدهنده پایه (Basic Provider): ارائهدهنده ریاضی چندپلتفرمی Unity. این ارائهدهنده به FrameTimingManager متکی است. با این حال، برای عملکرد این انجین به تایمرهای GPU سختافزاری با دقت بالا نیاز دارد که به دلایل امنیتی (برای جلوگیری از حملات Spectre/Meltdown) در مرورگر مسدود یا بهشدت مبهم شدهاند. در نتیجه، Basic Provider رسمی عملاً در WebGL مقداردهی اولیه نمیشود.
راهحل WebAP: ما رویکردی متناسب با ویژگیهای وب طراحی کردهایم. WebAP نیز از FrameTimingManager بهره میبرد، اما بهجای تکیه صرف بر تایمرهای مسدود شده GPU، از تحلیل هیوریستیک (Heuristic) ایمن استفاده میکند. این افزونه ناهنجاریهای مرورگر (مانند تحریف متریکها ناشی از setTimeout در Emscripten) را دور زده و از ریاضیات محض برای محاسبه گلوگاهها (CPU در برابر GPU) استفاده میکند. این امر یک سیستم بهینهسازی سطح AAA ارائه میدهد که در هر مرورگری بهصورت قانونی و پایدار عمل میکند.
چرا از اسکریپتهای مقیاسبندی استاندارد استفاده نکنیم؟
راهحلهای کلاسیک بهسادگی وضوح صفحه را در اولین نشانه تأخیر کاهش میدهند. اگر برنامه به دلیل محاسبات پردازنده (فیزیک، اسکریپتها، منطق) بهجای رندر شدن با مشکل مواجه شود، این کار بیفایده است.
WebAP چگونه کار میکند:
- تشخیص گلوگاه (Bottleneck Detection)
افزونه بهطور ریاضی تعیین میکند که چه چیزی فریم را محدود میکند: CPU یا GPU. اگر فیزیک با تأخیر مواجه شود، سیستم فیزیک را بدون کاهش وضوح صفحه ساده میکند. بیش از ۱۲ مقیاسکننده (Scaler) مستقل (سایهها، LODها، Layer Culling و غیره) برای این منظور در نظر گرفته شده است. - سیستم جریمه ضد یویو (Anti Yo-Yo Penalty System)
این سیستم، مشکل رایج وضوح پویا هنگام چشمکزدن کیفیت (Quality flickering) را حل میکند. اگر بهبود گرافیک باعث افت فوری FPS شود، سیستم یک جریمه موقت (Penalty Lockout) را برای جلوگیری از افزایش بیشتر اجرا میکند. - حفظ وضوح UI
اگر حالت مقیاسبندی از طریقRenderTextureرا انتخاب کنید، وضوح دنیای سهبعدی کاهش مییابد، اما رابط کاربری در مقیاس اصلی مرورگر (Native Browser Scaling) باقی میماند. کامپوننت سفارشیWebScaledPhysicsRaycasterمختصات Ray را بهطور خودکار محاسبه میکند تا کلیکها روی اشیاء سهبعدی بدون در نظر گرفتن فشردهسازی فریم، بینقص عمل کنند. - معماری Zero-GC
کل پروژه با در نظر گرفتن صرفهجویی شدید در حافظه طراحی شده است. هسته از بافرهای حلقوی O(1) استفاده میکند و هیچگونه تخصیص حافظهای (Allocation) در حلقهUpdateانجام نمیدهد. در نتیجه، افزونه Garbage Collector (GC) را فعال نمیکند. - پاکسازی سختگیرانه نسخه نهایی (Build)
بسیاری از Assetها با قرار دادن Prefabها و تکسچرهای خود در پوشهResources(مجبور کردن انجین برای شامل کردن آنها در Build) حجم نسخه نهایی را افزایش میدهند. معماری WebAP از این خطا جلوگیری میکند. مگر اینکه صریحاً به صحنه اضافه شوند، تمام ابزارها و رابط کاربری داشبورد بهطور خودکار در طول کامپایل حذف میشوند. تنها هسته سبکوزن به پروژه نهایی میرسد. - ادغام Plug-and-Play
تنظیمات در یک رابط کاربری یکپارچه در بخش Project Settings متمرکز شدهاند. افزونه بهطور خودکار خود را به نسخه نهایی تزریق میکند — نیازی به قرار دادن دستی Prefabهای مدیریتی در صحنههای خود ندارید.
سازگاری
- نسخه Unity: نسخه
2020.3 LTSو جدیدتر. این افزونه از APIهای مدرن استفاده میکند و ویژگیهای جدید انجین (مانند پشتیبانی ازMesh LOD Thresholdاز نسخه Unity 6000.2+) را بهطور خودکار اتخاذ میکند. - پایپلاین رندر (Render Pipeline): پشتیبانی کامل هم از Built-in Render Pipeline (BiRP) و هم از Universal Render Pipeline (URP).
