Unity 6.3
0 онлайн 78 гостей 3 в системе
Вход
Программирование в Unity Шаг 197 из 210

8. Испытания на эффективность

Цели обучения

Одна из последних вещей, которую мы рассмотрим, это пакет, который расширяет Unity Test Framework с Performance Tests.

2010 год

Пакет Performance Testing может быть использован для измерения производительности в нашей игре. Это отличный инструмент, если мы хотим отслеживать различные регрессии/прогрессы, которые происходят со временем в нашем проекте. В этом примере вы узнаете, как создать тест, который измеряет средние игровые кадры.

  1. LostCrypt не включает в себя пакет Performance Testing, установленный по умолчанию. Установите его, следуя этим инструкциям.
  2. Добавить пакет в качестве зависимости к манифест проекта.
  3. После установки пакета добавьте ссылку на Unity.PerformanceTesting в определение сборки PlayModeTests, чтобы получить доступ к тестированию производительности APIs.
  4. Создайте новый класс C# в Ассеты/испытания/PlayModeTests вызванный PerformanceTests.cs.

Теперь вы готовы завершить свою задачу. В PerformanceTests.cs создайте новую функцию под названием MainScene_MeasureAverageFrames(). В этой функции переместите персонажа в положение палочки и подождите, пока эффект подбора палочки не закончится. В течение всего этого времени измеряйте кадры.

Бонус

  • Попробуйте измерить среднее значение FPS в LostCrypt. Вам может понадобиться использовать Time.deltaTime из UnityEngine, API и Measure.Custom из пакета Performance Testing API.

Подсказки

  • Первая горстка кадров после загрузки Scene обычно нестабильны, давайте использовать Measure.Frames().Scope() API, чтобы измерить их в отдельном диапазоне.
  • После завершения теста, результаты производительности могут быть просмотрены в Window > General > Performance Test Report или вы можете даже подключиться к результатам с помощью Callback API.

Решение

PerformanceTests.cs

using System.Collections;
using Unity.PerformanceTesting;
using UnityEngine;
using UnityEngine.TestTools;
using UnityEngine.SceneManagement;

public class PerformanceTests
{
    private Transform _characterTransform;
    private float _wandLocation = 21.080f;
        
    [UnityTest, Performance]
    public IEnumerator MainScene_MeasureAverageFrames()
    {
        SceneManager.LoadScene("Assets/Scenes/Main.unity", LoadSceneMode.Single);
        using (Measure.Frames().Scope("Frames.MainSceneOnLoad.Unstable"))
        {
            for (var i = 0; i < 25; i++)
            {
                yield return null;
            }
        }

        using (Measure.Frames().Scope("Frames.MainSceneGameplay"))
        {
            yield return GoRight();
            while (GetCurrentCharacterPosition() <= _wandLocation)
            {
                yield return null;
            }

            StopMoving();
            yield return new WaitForSeconds(15);
        }
    }

    private float GetCurrentCharacterPosition()
    {
        // Get Main character's Transform which is used to manipulate position.
        if (_characterTransform == null)
        {
            _characterTransform = GameObject.Find("Sara Variant").transform;
        }

        return _characterTransform.position.x;
    }

    private IEnumerator GoRight()
    {
        TestInputControl.MoveLeft = false;
        yield return null;
        TestInputControl.MoveRight = true;
    }

    private void StopMoving()
    {
        TestInputControl.MoveRight = false;
        TestInputControl.MoveLeft = false;
    }
}

Бонусное решение

Measure.Custom("FPS", (int)(1f / Time.deltaTime));