توابع ضبط زمان بارگذاری را اضافه کنید

به دو دلیل مهم است که زمانی که بازی شما در حال اجرای رویدادهای بارگذاری است، ضبط کنید:

  1. برای اینکه داده‌های زمان فریم خود را هنگام بارگیری آلوده نکنید.
  2. برای تجزیه و تحلیل زمان بارگذاری برای دیدن زمان و مکان بارگذاری بیشتر از حد قابل قبول.

یک رویداد بارگیری می‌تواند ابرداده مرتبط داشته باشد:

public class LoadingTimeMetadata
{
    public enum LoadingState
    {
        Unknown = 0,

        /// <summary>
        ///     The first time the game is run.
        /// </summary>
        FirstRun = 1,

        /// <summary>
        ///     App is not backgrounded.
        /// </summary>
        ColdStart = 2,

        /// <summary>
        ///     App is backgrounded.
        /// </summary>
        WarmStart = 3,

        /// <summary>
        ///     App is backgrounded, least work needed.
        /// </summary>
        HotStart = 4,

        /// <summary>
        ///     Asset loading between levels.
        /// </summary>
        InterLevel = 5
    }

    public LoadingState state;

    public enum LoadingSource
    {
        UnknownSource = 0,

        /// <summary>
        ///     Uncompressing data.
        /// </summary>
        Memory = 1,

        /// <summary>
        ///     Reading assets from APK bundle.
        /// </summary>
        Apk = 2,

        /// <summary>
        ///     Reading assets from device storage.
        /// </summary>
        DeviceStorage = 3,

        /// <summary>
        ///     Reading assets from external storage, e.g. SD card.
        /// </summary>
        ExternalStorage = 4,

        /// <summary>
        ///     Loading assets from the network.
        /// </summary>
        Network = 5,

        /// <summary>
        ///     Shader compilation.
        /// </summary>
        ShaderCompilation = 6,

        /// <summary>
        ///     Time spent between process starting and onCreate.
        /// </summary>
        PreActivity = 7,

        /// <summary>
        ///     Total time spent between process starting and first render frame.
        /// </summary>
        FirstTouchToFirstFrame = 8,

        /// <summary>
        ///     Time from start to end of a group of events.
        /// </summary>
        TotalUserWaitForGroup = 9
    }

    public LoadingSource source;

    /// <summary>
    ///     0 = no compression, 100 = max compression
    /// </summary>
    public int compression_level;

    public enum NetworkConnectivity
    {
        Unknown = 0,
        Wifi = 1,
        CellularNetwork = 2
    }

    public NetworkConnectivity network_connectivity;

    /// <summary>
    ///     Bandwidth in bits per second.
    /// </summary>
    public ulong network_transfer_speed_bps;

    /// <summary>
    ///     Latency in nanoseconds.
    /// </summary>
    public ulong network_latency_ns;
}

هر فیلدی که با نیازهای شما مرتبط نیست می تواند صفر باشد.

یک رویداد بارگیری همچنین می تواند یک حاشیه نویسی مرتبط داشته باشد. می‌توانید مانند حاشیه‌نویسی زمان فریم، با استفاده از یک یا چند فیلد در پیام Annotation تعریف کنید.

Result<ulong> StartRecordingLoadingTime(LoadingTimeMetadata eventMetadata, TAnnotation annotation);

این تابع شروع به ضبط یک رویداد زمان بارگذاری مرتبط با فراداده و حاشیه نویسی می کند و یک Result<ulong>.value برای استفاده در تابع StopRecordingLoadingTime() پر می کند.

ErrorCode StopRecordingLoadingTime(ulong handle);

این تابع ضبط رویدادی را که قبلاً توسط StartRecordingLoadingTime() شروع شده بود متوقف می کند. این رویداد در جلسه بعدی بارگذاری می شود.

بارگیری توابع گروه

در بازی خود، ممکن است چندین رویداد بارگیری را برای یک دوره بارگیری که توسط کاربر مشاهده شده است، ضبط کنید. برخی از مثال‌ها شامل بارگذاری فایل ، بارگذاری صحنه ، فشرده‌سازی و کامپایل کردن سایه‌زن می‌شود.

مهم است که به Android Performance Tuner اطلاع دهید که رویدادهای بارگیری بخشی از چنین گروهی است تا بتواند بینش بهتری ارائه دهد. برای انجام این کار، رویدادهای بارگیری خود را با توابع شروع و توقف زیر براکت کنید.

Result<ulong> StartLoadingGroup(LoadingTimeMetadata eventMetadata, TAnnotation annotation);

این تابع یک گروه بارگیری مرتبط با فراداده و حاشیه نویسی داده شده را شروع می کند و یک Result<ulong>.value برای استفاده در تابع StopLoadingGroup() پر می کند. فراداده و حاشیه نویسی در حال حاضر توسط باطن Play استفاده نمی شود، اما فقط حاشیه نویسی را می توان روی null تنظیم کرد. همه رویدادهای بارگیری بعدی توسط یک شناسه گروه منحصر به فرد برچسب گذاری می شوند.

ErrorCode StopLoadingGroup(ulong handle);

این تابع یک گروه بارگیری را که قبلا توسط StartLoadingGroup() شروع شده بود متوقف می کند. رویدادهای بارگیری بعدی تا زمانی که StartLoadingGroup() دوباره فراخوانی نشود شناسه گروهی ندارند.

شکل 1. نمونه ای از گروه بارگیری.

نمونه ها

در اینجا چند نمونه از نحوه اضافه کردن توابع زمان بارگذاری به بازی خود آورده شده است.

رویدادهای بارگذاری فایل

مثال کد زیر نحوه ثبت رویدادهای بارگذاری فایل در بازی خود را نشان می دهد.

public RawImage image;

IEnumerator LoadImageFromStreamingAssets(string imageName)
{
    string imagePath = "file://" + Path.Combine(Application.streamingAssetsPath, imageName);
    using (var r = UnityWebRequestTexture.GetTexture(imagePath))
    {
        LoadingTimeMetadata fileLoadingMetadata = new LoadingTimeMetadata()
        {
            state = LoadingTimeMetadata.LoadingState.InterLevel,
            source = LoadingTimeMetadata.LoadingSource.DeviceStorage,
            // Fields are zero by default but they could be set as follows
            compression_level = 0,
            network_connectivity = 0,
            network_transfer_speed_bps = 0,
            network_latency_ns = 0
        };
        Annotation annotation = new Annotation()
        {
            Scene = Scene.MagicalForest
        };
        // Start recording loading time.
        Result<ulong> result = performanceTuner.StartRecordingLoadingTime(fileLoadingMetadata, annotation);
        yield return r.SendWebRequest();
        // Stop recording loading time.
        performanceTuner.StopRecordingLoadingTime(result.value);
        if (r.isNetworkError || r.isHttpError)
        {
            Debug.Log(r.error);
        }
        else
        {
            Texture2D tex = DownloadHandlerTexture.GetContent(r);
            image.texture = tex;
        }
    }
}

رویدادهای بارگیری صحنه

مثال کد زیر نحوه ضبط رویدادهای بارگذاری صحنه در بازی خود را نشان می دهد.

IEnumerator LoadScene(int sceneIndex)
{
    LoadingTimeMetadata metadata = new LoadingTimeMetadata()
        {state = LoadingTimeMetadata.LoadingState.InterLevel};
    Annotation annotation = new Annotation() {Scene = (Scene) (sceneIndex + 1)};
    Result<ulong> result = performanceTuner.StartRecordingLoadingTime(metadata, annotation);
    AsyncOperation asyncSceneLoad = SceneManager.LoadSceneAsync(sceneIndex, LoadSceneMode.Single);
    while (!asyncSceneLoad.isDone)
    {
        yield return null;
    }

    performanceTuner.StopRecordingLoadingTime(result.value);
}

بارگیری توابع گروه

مثال کد زیر نحوه اضافه کردن توابع گروه بارگذاری را به بازی خود نشان می دهد.

IEnumerator LoadImages()
{
    LoadingTimeMetadata groupMetadata = new LoadingTimeMetadata()
    {
        state = LoadingTimeMetadata.LoadingState.InterLevel,
        source = LoadingTimeMetadata.LoadingSource.DeviceStorage,
    };
    Result<ulong> result = performanceTuner.StartLoadingGroup(groupMetadata, null);
    yield return StartCoroutine(LoadImageFromStreamingAssets("image1.jpeg"));
    yield return StartCoroutine(LoadImageFromStreamingAssets("image2.jpeg"));
    yield return StartCoroutine(LoadImageFromStreamingAssets("image3.jpeg"));
    yield return StartCoroutine(LoadImageFromStreamingAssets("image4.jpeg"));
    var stopErrorCode = performanceTuner.StopLoadingGroup(0);
}