Skip to content

چگونه کار می‌کند (How It Works)

راز کارایی WebAP در ماژولار بودن و رویکرد ریاضی آن نهفته است. این افزونه سعی نمی‌کند دلایل تأخیر را "حدس" بزند و کورکورانه وضوح صفحه را کاهش نمی‌دهد.

کل سیستم به‌عنوان یک خط لوله تنظیم‌شده (Pipeline) کار می‌کند که از سه لایه اصلی تشکیل شده است: Tracker (ردیاب)، Indexer (شاخص‌گذار) و Scalers (مقیاس‌کننده‌ها).

خط لوله تصمیم‌گیری (Decision Pipeline)

معماری افزونه، جمع‌آوری داده‌ها، تصمیم‌گیری و اجرا را به‌شدت از هم جدا می‌کند.

۱. Tracker (ناظر)

هر فریم، Tracker داده‌های خام زمان فریم و زمان خالص CPU را جمع‌آوری می‌کند. این بخش میانگین متحرک نمایی (Exponential Moving Average) را برای هموارسازی جهش‌های تصادفی ناشی از Garbage Collector (GC) یا بارگذاری Assetها محاسبه می‌کند.
Tracker تصمیمی نمی‌گیرد، فقط به دو سؤال پاسخ می‌دهد:

  • "آیا از Target Min FPS پیروی می‌کنیم؟"
  • "در حال حاضر کدام زیرسیستم خاص (گلوگاه) باعث تأخیر می‌شود؟"

۲. Indexer (مغز)

Indexer داده‌ها را از Tracker دریافت می‌کند و تصمیم می‌گیرد که چگونه ادامه دهد. این بخش به‌عنوان داور سیستم عمل می‌کند.
هنگام افت FPS، Indexer موارد زیر را انجام می‌دهد:
۱. بررسی می‌کند که آیا سیستم در حالت Cooldown (زمان انتظار) است یا خیر.
۲. سیستم جریمه ضد یویو را ارزیابی می‌کند (برای جزئیات بیشتر به بخش جریمه ضد یویو مراجعه کنید).
۳. هزینه تمام Scalerهای موجود را محاسبه می‌کند.
۴. به Scalerی فرمان می‌دهد که بیشترین عملکرد را با کمترین آسیب بصری ارائه دهد.

۳. Scalers (مجریان)

یک Scaler فرمانی را از Indexer دریافت کرده و کار سنگین را انجام می‌دهد. با API انجین Unity تعامل می‌کند و تنظیمات لازم (کاهش وضوح، پنهان کردن لایه‌ها، غیرفعال کردن Anti-Aliasing) را اعمال می‌کند.

گلوگاه‌ها (Bottlenecks): یافتن مرز بدون دماسنج

WebAP چگونه بدون دسترسی به سنسورهای دستگاه دقیقاً متوجه می‌شود که هنگام مدیریت بار چه چیزی دچار نقص است؟ این افزونه با تحلیل نسبت‌های زمان‌بندی (Timing Ratios) در خود انجین این کار را انجام می‌دهد.

  • گلوگاه پردازنده (CPU Bottleneck): Tracker زمان خالص روی نخ (Thread) اصلی پردازنده را بر کل زمان فریم تقسیم می‌کند. اگر این نسبت از ۸۵٪ بیشتر شود، نتیجه‌گیری واضح است: فریم توسط منطق یا محاسبات فیزیک محدود شده است. کاهش وضوح صفحه یا خاموش کردن سایه‌ها بی‌فایده خواهد بود.
  • گلوگاه کارت گرافیک (GPU Bottleneck): اگر FPS کلی کمتر از حد نرمال باشد اما نسبت CPU زیر ۸۵٪ باشد، نشان‌دهنده بیکار بودن پردازنده است. این کارت گرافیک است که نمی‌تواند فریم را در زمان مقرر رندر کند (گلوگاه Fillrate، شیدرهای سنگین، یا Overdraw).
  • نرخ فریم هدف (Target Frame Rate): اگر زمان انتظار VSync بیشتر از صفر باشد، به این معنی است که هم پردازنده و هم کارت گرافیک رندرینگ را سریع‌تر از نرخ تازه‌سازی (Refresh Rate) مانیتور به پایان رسانده‌اند. سیستم با حاشیه عملکرد (Performance Headroom) کار می‌کند و Indexer می‌تواند به‌آرامی کیفیت گرافیک را افزایش دهد.

Zero-GC: عملکرد در اولویت

افزونه‌ای که برای نجات بازی شما از تأخیر طراحی شده است، هرگز نباید خودش باعث لگ شود. هسته WebAP با در نظر گرفتن صرفه‌جویی شدید در حافظه (Zero-GC) در طول مسیرهای پردازشی سنگین طراحی شده است.

  • بافرهای حلقوی O(1): به‌جای استفاده از لیست‌هایی مانند List<float> و حلقه‌های سنگین در Update، Tracker از آرایه‌های با اندازه ثابت (Ring Buffers) استفاده می‌کند. محاسبه میانگین FPS در زمان ثابت O(1) انجام می‌شود.
  • بدون تخصیص (Allocation) در Update: هیچ‌گونه فراخوانی new، Boxing، یا Lambda در هسته وجود ندارد. Garbage Collector (GC) مطلقاً چیزی برای پاک کردن نخواهد داشت.
  • کش نماینده‌ها (Delegate Cache): حتی برای کارهای پیچیده (نظیر رهگیری کلیک‌ها در WebScaledPhysics2DRaycaster)، ما از Reflection کُند (MethodInfo.Invoke) دوری کرده و از Delegateهای کامپایل‌شده سریع استفاده می‌کنیم.

نامرئی بودن (Invisibility)

به لطف این بهینه‌سازی‌ها، هزینه پردازشی (Overhead) کل خط لوله WebAP به حداقل می‌رسد. پردازنده حتی متوجه نخواهد شد که در حال نظارت شدن است.