Yükleme süresi kaydetme işlevleri ekleme

Oyununuzun ne zaman yükleme etkinlikleri gerçekleştirdiğini kaydetmek önemlidir. iki neden vardır:

  1. Yükleme sırasında kare süresi verilerinizin kirli olmasını önlemek için
  2. Yükleme sürelerinin ne zaman ve nerede daha uzun olduğunu görmek için yükleme sürelerini analiz etmek kabul edilir.

Bir yükleme etkinliğinin ilişkili meta verileri olabilir:

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

İhtiyaçlarınızla alakalı olmayan alanlar sıfır olabilir.

Bir yükleme etkinliğinin, ilişkili bir ek açıklaması da olabilir. Hesap oluşturma işlemini Kare süresi ek açıklamalarıyla aynı şekilde, Annotation öğesinin bir veya daha fazla alanının kullanılmasını sağlayın mesajını alırsınız.

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

Bu işlev, verilen meta verileri ve ek açıklamaları içerir, ayrıcaResult<ulong>.value StopRecordingLoadingTime() işlevi.

ErrorCode StopRecordingLoadingTime(ulong handle);

Bu işlev, daha önce şu kullanıcı tarafından başlatılan bir etkinliği kaydetmeyi durdurur: StartRecordingLoadingTime() Etkinlik, bir sonraki oturumun boşaltılmasında yüklenir.

Grup işlevleri yükleniyor

Oyununuzda tek bir yükleme süresi boyunca birkaç yükleme etkinliği kaydedebilirsiniz kullanıcı tarafından görülür. Örnek olarak dosya yükleme, sahne yükleme, sıkıştırma açma ve gölgelendirici derleme.

Android Performance Tuner'a, yükleme etkinliklerinin gruplayarak daha iyi analizler elde edebilir. Yüklemenizi hızlandırın etkinlikleri aşağıdaki başlatma ve durdurma işlevlerine sahip olan etkinlikler olarak ayarlayabilirsiniz.

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

Bu işlev, belirtilen meta verilerle ilişkili bir yükleme grubu başlatır ve ek açıklamasına yer verir veResult<ulong>.value StopLoadingGroup() işlevi. Meta veri ve ek açıklama şu anda tarafından kullanılır, ancak yalnızca ek açıklama null olarak ayarlanabilir. Sonraki tüm yükleme etkinlikleri benzersiz bir grup kimliğiyle etiketlenir.

ErrorCode StopLoadingGroup(ulong handle);

Bu işlev, daha önce StartLoadingGroup() tarafından başlatılan bir yükleme grubunu durdurur. Sonraki yükleme etkinlikleri StartLoadingGroup() tarihine kadar grup kimliğine sahip olmayacak tekrar çağrılır.

. Şekil 1. Yükleme grubunu gösteren örnek.

Örnekler

Aşağıda, oyununuza yükleme süresi işlevlerini nasıl ekleyeceğinize dair bazı örnekler verilmiştir.

Dosya yükleme etkinlikleri

Aşağıdaki kod örneğinde, oyununuzdaki dosya yükleme etkinliklerinin nasıl kaydedileceği gösterilmektedir.

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

Sahne yükleme etkinlikleri

Aşağıdaki kod örneğinde, sahne yükleme etkinliklerinin bir oyundur.

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

Grup işlevleri yükleniyor

Aşağıdaki kod örneğinde, bir oyundur.

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