Thêm hàm ghi thời gian tải

Bạn cần ghi lại thời điểm trò chơi thực hiện sự kiện tải vì hai lý do:

  1. Tránh gây xáo trộn dữ liệu thời gian kết xuất khung hình trong khi tải.
  2. Phân tích thời gian tải để xem thời điểm và vị trí xảy ra thời gian tải lâu hơn mức chấp nhận được.

Một sự kiện tải có thể có siêu dữ liệu liên kết:

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;
}

Bất kỳ trường nào không liên quan đến nhu cầu của bạn đều có thể bằng 0.

Sự kiện tải cũng có thể có chú giải liên quan. Bạn có thể xác định theo cách giống với các chú giải thời gian kết xuất khung hình, sử dụng một hoặc nhiều trường trong thông báo Annotation.

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

Hàm này bắt đầu ghi lại một sự kiện thời gian tải liên kết với siêu dữ liệu và chú giải nhất định, sau đó điền Result<ulong>.value để dùng trong hàm StopRecordingLoadingTime().

ErrorCode StopRecordingLoadingTime(ulong handle);

Hàm này dừng ghi lại một sự kiện do StartRecordingLoadingTime() bắt đầu trước đó. Sự kiện sẽ được tải lên vào lần xả phiên tiếp theo.

Hàm cho nhóm tải

Trong trò chơi, bạn có thể ghi lại một số sự kiện tải trong một khoảng thời gian tải duy nhất mà người dùng đã thấy. Một số ví dụ bao gồm tải tệp, tải cảnh, giải nén và biên dịch chương trình đổ bóng.

Bạn phải thông báo cho Android Performance Tuner rằng các sự kiện tải là một phần của nhóm đó để Android Performance Tuner có thể cung cấp thông tin chi tiết hơn. Để làm vậy, hãy sử dụng các hàm bắt đầu và dừng sau đây để bắt đầu và dừng các sự kiện tải của bạn.

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

Hàm này bắt đầu một nhóm tải liên kết với siêu dữ liệu và chú giải nhất định, sau đó điền Result<ulong>.value để sử dụng trong hàm StopLoadingGroup(). Siêu dữ liệu và chú giải hiện không được phần phụ trợ của Play sử dụng và có thể được đặt thành null. Tất cả các sự kiện tải tiếp theo được gắn một mã nhận dạng nhóm duy nhất.

ErrorCode StopLoadingGroup(ulong handle);

Hàm này dừng một nhóm tải do StartLoadingGroup() bắt đầu trước đó. Các sự kiện tải tiếp theo sẽ không có mã nhận dạng nhóm cho đến khi StartLoadingGroup() được gọi lại.

Hình 1. Ví dụ về nhóm tải.

Ví dụ

Dưới đây là một số ví dụ về cách thêm hàm thời gian tải vào trò chơi.

Sự kiện tải tệp

Mã ví dụ sau đây cho thấy cách ghi lại các sự kiện tải tệp trong trò chơi.

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;
        }
    }
}

Sự kiện tải cảnh

Mã ví dụ sau đây cho thấy cách ghi lại các sự kiện tải cảnh trong trò chơi.

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);
}

Hàm cho nhóm tải

Mã ví dụ sau đây cho thấy cách thêm hàm cho nhóm tải vào trò chơi.

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);
}