英文原文:https://medium.com/@terence410/unity-performance-test-e80ee3cd64a7
没有什么比光速更快
阅读
- Performance Testing Extension for Unity Test Runner
- Performance Benchmarking in Unity: How to Get Started
- Test Example Codes
- The Unity Performance Benchmark tool
它能实现什么
- 与单元测试集成
- 记录 FPS、Ram、Draw call 等
- 与Profiler集成,可以获得单个元素的执行时间
如何启用性能测试
- 打开 /YourProject/Packages/manifest.json
- 添加以下内容
{
“dependencies”: {
…
},
“testables”: [
“com.unity.test-framework.performance”
]
- 创建一个文件夹 Assets/Tests
- 创建一个 assembly definition
- 选中“测试程序集”框并在程序集定义引用中选择“Unity.PerformanceTesting”。选择“任何平台”
- 创建测试脚本:Create > Testing > C# Test Script
- 打开 Window > General > Test Runner
- 打开 Window > Analysis > Performance Test Report
测试脚本
请注意,Profiler 数据只能用于其自己的命名范围。例如,您无法测量两个不同范围的代码的“PlayerLocal”,请尝试为此目的创建两个不同的测试用例。
using System.Collections;
using NUnit.Framework;
using Unity.PerformanceTesting;
using UnityEngine;
using UnityEngine.Profiling;
using UnityEngine.SceneManagement;
// 为 test 测试定义自定义变量
[TestFixture(1)]
public class PerformanceTest
{
private int _value;
public PerformanceTest(int value)
{
_value = value;
}
[PerformanceUnityTest]
public IEnumerator SampleTest()
{
// 它转到组名称“Time”
// 测量一个方法的执行时间(测量10次,使用5次测量的平均值)
Measure.Method(() =>
{
for (int i = 0; i < 1000000; i++)
{
}
})
.MeasurementCount(10)
.IterationsPerMeasurement(5)
.Run();
// 它转到组名称“Time”
// 测量10 帧的执行时间,等待 5 帧预热
yield return Measure.Frames()
.WarmupCount(5)
//.ProfilerMarkers(groupDefinitions) // 如果我们只想测量没有记录帧的分析器
//.DontRecordFrametime()
.MeasurementCount(11)
.Run();
// 测量所有帧的执行时间
using (Measure.Frames().Scope(new SampleGroupDefinition("Group 1")))
{
// your code
yield return null;
yield return null;
}
// 测量分析器数据
SampleGroupDefinition[] groupDefinitions =
{
new SampleGroupDefinition("PlayerLoop"),
new SampleGroupDefinition("Camera.Render"),
};
using (Measure.ProfilerMarkers(groupDefinitions))
{
for (var i = 0; i < 60; i++)
{
yield return null;
}
}
// 测量内存
var allocated = new SampleGroupDefinition("TotalAllocatedMemory", SampleUnit.Megabyte);
var reserved = new SampleGroupDefinition("TotalReservedMemory", SampleUnit.Megabyte);
for (var i = 0; i < 60; i++)
{
Measure.Custom(allocated, Profiler.GetTotalAllocatedMemoryLong() / 1048576f);
Measure.Custom(reserved, Profiler.GetTotalReservedMemoryLong() / 1048576f);
yield return null;
}
// 加载场景
using (Measure.Scope(new SampleGroupDefinition("Group 3")))
{
SceneManager.LoadScene("Assets/TestPlayMode/TestScene2.unity");
}
// 测量对象的实例
using (Measure.Scope(new SampleGroupDefinition("Group 4")))
{
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
for (var i = 0; i < 5000; i++)
{
UnityEngine.Object.Instantiate(cube);
}
}
yield return null;
}
}