8. Испытания на эффективность
Цели обучения
Одна из последних вещей, которую мы рассмотрим, это пакет, который расширяет Unity Test Framework с Performance Tests.
2010 год
Пакет Performance Testing может быть использован для измерения производительности в нашей игре. Это отличный инструмент, если мы хотим отслеживать различные регрессии/прогрессы, которые происходят со временем в нашем проекте. В этом примере вы узнаете, как создать тест, который измеряет средние игровые кадры.
- LostCrypt не включает в себя пакет Performance Testing, установленный по умолчанию. Установите его, следуя этим инструкциям.
- Добавить пакет в качестве зависимости к манифест проекта.
- После установки пакета добавьте ссылку на
Unity.PerformanceTestingв определение сборки PlayModeTests, чтобы получить доступ к тестированию производительности APIs. - Создайте новый класс 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));