رابط برنامهنویسی عمومی (Public API)
ابزار WebAP طوری طراحی شده است که به توسعهدهندگان اجازه میدهد تا کنترل مطلق سیستم را در دست داشته باشند. اگر بازی شما دارای سناریوهای خاصی است (مانند کاتسینها یا منوی توقفی که در آنها FPS اهمیت کمتری دارد)، میتوانید افزونه را مدیریت کرده و متریکهای آن را از طریق یک API ساده C# بخوانید.
تنها نقطه ورود (Entry Point) به سیستم، کلاس Singleton با نام WebPerformanceIndexer.Instance است.
کنترل سراسری (Global Control)
میتوانید کارهای افزونه را در هر زمانی متوقف (Pause) کنید. هنگامی که Indexer غیرفعال میشود، سطح فعلی Scalerها قفل (Freeze) میشود.
using GrindsetStudios.WebAdaptivePerformance.Core;
// توقف بهینهسازی خودکار
WebPerformanceIndexer.Instance.enabled = false;
// از سرگیری کار
WebPerformanceIndexer.Instance.enabled = true;خواندن متریکها (Reading Metrics)
اگر میخواهید متریکها را روی UI درونبازی خود خروجی بگیرید (یا آنها را به یک ابزار Analytics ارسال کنید) و نیازی به استفاده از داشبورد داخلی (Dashboard) ندارید، میتوانید دادههای خام را مستقیماً از Tracker دریافت کنید.
using GrindsetStudios.WebAdaptivePerformance.Core;
using UnityEngine;
public class CustomMetricsUI : MonoBehaviour
{
private void Update()
{
var indexer = WebPerformanceIndexer.Instance;
if (indexer == null || !indexer.enabled) return;
var tracker = indexer.Tracker;
// ۱. زمانبندیهای اصلی
float frameTime = tracker.AverageFrameTime;
float cpuTime = tracker.AverageCpuTime;
int currentFps = Mathf.RoundToInt(1f / frameTime);
// ۲. در حال حاضر چه چیزی باعث تأخیر میشود؟ (CPU، GPU، TargetFrameRate، یا Unknown)
PerformanceBottleneck bottleneck = tracker.CurrentBottleneck;
// ۳. افزونه در حال حاضر چه کاری انجام میدهد؟ (Increase، Decrease، Stale)
PerformanceAction action = indexer.CurrentAction;
Debug.Log($"FPS: {currentFps} | Bottleneck: {bottleneck} | Action: {action}");
}
}بازنویسی دستی Scaler (Manual Overrides)
گاهی اوقات لازم است از اتوماسیون (Automation) عبور کنید. برای مثال، ممکن است بخواهید در منوی اصلی (Main Menu)، وضوح صفحه همیشه بدون توجه به تأخیر دستگاه در سطح 100٪ بماند و تصویر واضح باشد.
هر Scaler دارای ویژگی OverrideLevel است.
نحوه کار OverrideLevel
- مقدار
-1— Indexer بهطور خودکار Scaler را مدیریت میکند (پیشفرض). - مقادیر
0تاMaxLevel— Scaler را در حالت دستی (Manual) قرار میدهد و کیفیت آن را روی سطح انتخابی قفل میکند.
using GrindsetStudios.WebAdaptivePerformance.Core;
using GrindsetStudios.WebAdaptivePerformance.Scalers.Resolution;
using UnityEngine;
public class MenuController : MonoBehaviour
{
public void OnEnterMainMenu()
{
var indexer = WebPerformanceIndexer.Instance;
// در میان Scalerهای فعال به دنبال Resolution Scaler میگردد
if (indexer.TryGetActiveScaler<WebResolutionScaler>(out var resScaler))
{
// آن را بهشدت روی سطح ۰ (حداکثر کیفیت) قفل میکند
// Indexer دیگر نمیتواند آن را تغییر دهد
resScaler.OverrideLevel = 0;
}
}
public void OnExitMainMenu()
{
var indexer = WebPerformanceIndexer.Instance;
if (indexer.TryGetActiveScaler<WebResolutionScaler>(out var resScaler))
{
// کنترل را به اتوماسیون افزونه بازمیگرداند
resScaler.OverrideLevel = -1;
}
}
}افزودن پویای Scaler (Dynamic Scaler Addition)
شما میتوانید ماژولها را بهطور پویا در حین اجرا (Runtime) فعال و غیرفعال کنید. بهعنوان مثال، میتوانید در حالی که بازیکن در حال رانندگی با وسیله نقلیه است، WebPhysicsStepScaler را غیرفعال کنید و با حرکت پیاده او، آن را دوباره فعال کنید.
هنگامی که یک Scaler را حذف میکنید، پارامترهای آن بهطور خودکار و ایمن به حداکثر کیفیت برمیگردند.
using GrindsetStudios.WebAdaptivePerformance.Core;
using GrindsetStudios.WebAdaptivePerformance.Scalers;
public class GameplayManager
{
public void EnablePhysicsOptimization()
{
// افزودن پویا یک Scaler
WebPerformanceIndexer.Instance.TryAddScaler<WebPhysicsStepScaler>();
}
public void DisablePhysicsOptimization()
{
// حذف Scaler (پارامترهای فیزیک به مقادیر پیشفرض بازمیگردند)
WebPerformanceIndexer.Instance.TryRemoveScaler<WebPhysicsStepScaler>();
}
}