سؤالات متداول و عیبیابی (FAQ)
این بخش راهحلهایی برای مشکلات رایج و پاسخهایی به سؤالاتی که اغلب در طول بهینهسازی WebGL پیش میآیند، ارائه میدهد.
نصب و صحنه دمو
پرسش: صحنه دمو را باز کردم، اما تمام متریالها و اشیاء صورتی هستند!
پاسخ: پروژه شما از URP استفاده میکند، در حالی که صحنه دمو بهطور پیشفرض برای BiRP تنظیم شده است. کافیست پکیج واقع در مسیر WebAdaptivePerformance/Demo/Import Me (URP).unitypackage را استخراج (Unpack) کنید. شیدرها بهطور خودکار بهروز خواهند شد.
پرسش: افزونه را نصب کردم، اما از نظر بصری مطلقاً هیچ تغییری در بازی ایجاد نمیشود.
پاسخ: چکلیست زیر را بررسی کنید:
- آیا افزونه در Project Settings فعال است؟ آیا Scalerها اضافه و فعال شدهاند؟
- آیا گرافیکهای Unity بهطور پیشفرض روی حداکثر پیکربندی شدهاند؟ اگر تنظیمات از قبل روی پایینترین حالت باشند، افزونه چیزی برای کاهش نخواهد داشت.
- ممکن است دستگاه بهخوبی بار پردازشی را مدیریت میکند و FPS پایدار است. Prefab
Dashboardرا به صحنه اضافه کنید تا تصمیمات فعلی Indexer را مشاهده کنید. - اگر همهچیز بهدرستی پیکربندی شده اما باز هم تأثیری ندارد، با ما تماس بگیرید تا در عیبیابی به شما کمک کنیم.
وضوح (Resolution) و رابط کاربری (UI)
پرسش: وضوح صفحه تغییر نمیکند (Resolution Scaler غیرفعال است).
پاسخ: دو دلیل رایج عبارتند از:
۱. اگر از BiRP و حالت RenderTextureScaling استفاده میکنید: آرایه Target Tags را در تنظیمات Scaler بررسی کنید. اگر دوربین بازی شما نام متفاوتی (غیر از MainCamera) دارد، باید آن تگ (Tag) را اضافه کنید. در غیر این صورت افزونه نمیتواند دوربین را پیدا کند.
۲. حالت NativeBrowserScaling فقط در محیط رندر نهایی و بیلد شدهی WebGL کار میکند. این حالت درون Unity Editor هیچ کاری انجام نمیدهد.
پرسش: وقتی FPS افت میکند، رابط کاربری من هم مخدوش/تار میشود!
پاسخ: بررسی کنید که در BiRP گزینه RenderTextureScaling انتخاب شده باشد. خود Canvas باید در حالت Screen Space - Overlay تنظیم شده باشد (یا باید از یک دوربین اختصاصی فقط برای UI استفاده کنید).
پرسش: دکمههای استاندارد UI بهخوبی کار میکنند، اما کلیکهای ماوس (Raycastهای سفارشی) روی اشیاء سهبعدی اشتباه عمل میکنند.
پاسخ: رویدادهای استاندارد EventSystem توسط کامپوننت WebScaledPhysicsRaycaster بهطور کامل اصلاح میشوند. اما اگر Raycastهای دستی را از طریق کد (Camera.ScreenPointToRay()) فراخوانی کنید، به دلیل اینکه وضوح صفحه با وضوح رندر شده مطابقت ندارد، در مختصات کلیک دچار خطا میشوند. برای این منظور، از متد افزونه ما استفاده کنید: WebRaycasterUtility.TryComputeScaledRay().
متریکها و رفتار سیستم
پرسش: کیفیت گرافیک به دلیل تأخیر کاهش یافت. حالا FPS دوباره بالا رفته است، اما گرافیک به حالت قبل برنمیگردد!
پاسخ: بهاحتمال قوی سیستم جریمه ضد یویو (Anti Yo-Yo Penalty System) فعال شده است. افزونه برای جلوگیری از ناپایداری (Quality flickering)، بهبودهای بصری را موقتاً مسدود کرده است.
- اگر میخواهید گرافیک سریعتر تثبیت شود، محدوده پارامتر
Penalty Lockout Durationرا کاهش دهید (مثلاً آن را روی ۱۰ ثانیه تنظیم کنید). - همچنین
Increase Cooldownرا بررسی کنید؛ ممکن است زمان انتظار آن خیلی زیاد تنظیم شده باشد.
پرسش: داشبورد دائماً وضعیت CPU Bottleneck (گلوگاه پردازنده) یا Unknown را نشان میدهد، با وجود اینکه صحنه خالی است.
پاسخ: فراموش نکنید که Frame Timing Stats را در تنظیمات Player فعال کنید. سپس بررسی کنید که مقدار Application.targetFrameRate = -1 تنظیم شده باشد. با حذف محدودیتها از نوسازی زمان، شما متریکها را از کندیهای ناشی از اجرای تابع setTimeout در مرورگر آزاد و رها میسازید.
پرسش: کاراکتر من (یا اشیاء فیزیکی دیگر) بهشدت پرش دارند یا لگ میزنند.
پاسخ: این یکی از اثرات جانبی ناشی از فعالسازی اجباری Physics Step Scaler است. این بخش مقدار پایه Time.fixedDeltaTime را تغییر میدهد تا در هنگام افت شدید عملکرد، از گیر کردن پردازنده جلوگیری کند. با فعال کردن فوری تنظیمات Interpolate (یا Extrapolate) موجود در تب کامپوننت Rigidbody کاراکتر در صحنه خود، انتقالهای روان و بینقص را تضمین کنید.
پرسش: Scalerهای سایه (Shadow Scalers) فعال هستند، اما عملکرد همچنان در حال کاهش است و سایهها دستنخورده باقی ماندهاند.
پاسخ: این ماژولها صرفاً وظیفه نظارت و کنترل سایهها و نورپردازیهای پویای Realtime را بر عهده دارند. اگر تنظیمات نورپردازی محیط از قبل محاسبه شده باشد (Baked/Lightmaps)، این ابزار هیچگونه دخل و تصرفی روی آن نخواهد داشت.
Scalerهای سفارشی (Custom Scalers)
پرسش: Scaler اختصاصی خودم در حالت Editor عالی کار میکند، اما در نسخه Build شده برای WebGL کاملاً ناپدید میشود!
پاسخ: در رویههای داخلی و استاندارد سیستم، هماهنگکننده معماری IL2CPP اینطور برداشت میکند که کدهای شما بدون استفاده رها شدهاند ("dead code") و متعاقباً اقدام به حذف آنها میکند. از این رو، حتماً ویژگی الزامی [UnityEngine.Scripting.Preserve] را در بالاترین سطر و قبل از تعریف کلاس اصلی Scaler سفارشیِ خود وارد کنید.
