该项目的目的是同时测试和演示来自 Unity DOTS 技术堆栈的多个新包。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

248 行
8.5 KiB

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
//using Unity.PerformanceBenchmarking;
//using Unity.PerformanceBenchmarking.Data;
//using Unity.PerformanceBenchmarking.Measurements;
using UnityEngine;
using UnityEngine.Profiling;
using Debug = UnityEngine.Debug;
#if false
public class ProfileGameLoop : Game.IGameLoop
{
StateMachine<State> m_StateMachine;
string m_LevelName;
string m_ScenarioName;
public bool Init(string[] args)
{
if (args.Length < 2)
return false;
m_LevelName = args[0];
m_ScenarioName = args[1];
PerformanceTest.StartRun();
PerformanceTest.StartTest("A2 " + m_LevelName + " " + m_ScenarioName);
m_StartTicks = Stopwatch.GetTimestamp();
m_StateMachine = new StateMachine<State>();
m_StateMachine.Add(State.Loading, null, UpdateLoadingState, null);
m_StateMachine.Add(State.Active, EnterActiveState, UpdateActiveState, LeaveActiveState);
Console.SetOpen(false);
if (m_LevelName != ".")
{
Game.game.levelManager.LoadLevel(args[0]);
m_StateMachine.SwitchTo(State.Loading);
}
else
{
m_StateMachine.SwitchTo(State.Active);
}
RenderSettings.rVSync.Value = "0";
return true;
}
int m_Framecount;
bool m_LoadingDone;
bool m_ProfilerSamplingEnabled;
float m_FirstUpdateTime;
long m_StartTicks;
float m_NextCpuProfileTime;
double m_LastCpuUsage;
double m_LastCpuUsageUser;
double m_UserUsagePct;
double m_TotalUsagePct;
ProfilerScenario m_CurrentScenario;
List<ProfilerMeasurement> m_ProfilerMeasurements;
public void Update()
{
m_Framecount++;
m_StateMachine.Update();
if (!m_LoadingDone)
{
if (m_StateMachine.CurrentState() == State.Active)
{
m_FirstUpdateTime = Time.time;
var elapsedTicks = Stopwatch.GetTimestamp() - m_StartTicks;
Measure.Custom(new SampleGroupDefinition("Loading"), 0,
TimeSpan.FromTicks(elapsedTicks).TotalMilliseconds);
EnableProfiler();
m_LoadingDone = true;
}
return;
}
if (!m_ProfilerSamplingEnabled)
{
m_ProfilerSamplingEnabled = true;
return;
}
Measure.Custom(new SampleGroupDefinition("FrameTime"), Time.time, Time.unscaledDeltaTime * 1000f);
UpdateCpuUsageMeasurements();
Measure.Custom(new SampleGroupDefinition("TotalCpuUsage", SampleUnits.Percentage), Time.time, m_TotalUsagePct);
Measure.Custom(new SampleGroupDefinition("UserCpuUsage", SampleUnits.Percentage), Time.time, m_UserUsagePct);
if (Time.time - m_FirstUpdateTime > m_CurrentScenario.CaptureTime)
{
GameDebug.Log("Capture time reached");
Measure.Custom(new SampleGroupDefinition("FrameCount", SampleUnits.None), Time.time, m_Framecount);
ReportData();
Application.Quit();
}
}
public void FixedUpdate()
{
}
public void LateUpdate()
{
}
public void Shutdown()
{
}
void EnableProfiler()
{
if (Debug.isDebugBuild)
{
var filename = "A2 " + m_LevelName + " " + m_ScenarioName + " " +
DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");
var outputFile = Application.dataPath + "/" + filename + ".raw";
Profiler.logFile = outputFile;
Profiler.enableBinaryLog = true;
Profiler.enabled = true;
m_ProfilerMeasurements = new List<ProfilerMeasurement>();
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("GC.Collect")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("PlayerLoop")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("Render Thread")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("WaitForJobGroupID")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("EarlyUpdate.UpdateTextureStreamingManager")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("FixedUpdate.PhysicsFixedUpdate")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("Update.ScriptRunBehaviourUpdate")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("Update.DirectorUpdate")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("SimulationSystemGroup")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("PreLateUpdate.DirectorUpdateAnimationBegin")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("PreLateUpdate.DirectorUpdateAnimationEnd")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("PreLateUpdate.ScriptRunBehaviourLateUpdate")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("PostLateUpdate.VFXUpdate")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("PostLateUpdate.UpdateAllRenderers")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("PostLateUpdate.FinishFrameRendering")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("PostLateUpdate.PresentAfterDraw")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("HDRenderPipeline::Render " + m_ScenarioName)));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("Gfx.PresentFrame")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("GBuffer")));
m_ProfilerMeasurements.Add(Measure.ProfilerMarkers(new SampleGroupDefinition("Render shadows")));
}
}
void UpdateCpuUsageMeasurements()
{
if (Time.time > m_NextCpuProfileTime)
{
const float interval = 5.0f;
m_NextCpuProfileTime = Time.time + interval;
var process = Process.GetCurrentProcess();
var user = process.UserProcessorTime.TotalMilliseconds;
var total = process.TotalProcessorTime.TotalMilliseconds;
m_UserUsagePct = (float)(user - m_LastCpuUsageUser) / 10.0f / interval;
m_TotalUsagePct = (float)(total - m_LastCpuUsage) / 10.0f / interval;
m_LastCpuUsage = total;
m_LastCpuUsageUser = user;
}
}
void DisableProfiler()
{
if (Debug.isDebugBuild)
{
foreach (var profilerMeasurement in m_ProfilerMeasurements)
{
profilerMeasurement.Dispose();
}
Profiler.enableBinaryLog = false;
Profiler.enabled = false;
}
}
void LogResults(PerformanceTestRun run)
{
foreach (var result in run.Results)
{
GameDebug.Log(result.ToString());
}
}
void ReportData()
{
DisableProfiler();
PerformanceTest.EndTest();
var run = PerformanceTest.EndRun();
LogResults(run);
var filename = "A2 " + m_LevelName + " " + m_ScenarioName + " " + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");
var outputFile = Application.dataPath + "/" + filename + ".json";
GameDebug.Log("Reporting data to: " + outputFile);
var json = JsonUtility.ToJson(run);
File.WriteAllText(outputFile, json);
}
void UpdateLoadingState()
{
if (Game.game.levelManager.IsCurrentLevelLoaded())
m_StateMachine.SwitchTo(State.Active);
}
void EnterActiveState()
{
var scenarios = Resources.FindObjectsOfTypeAll<ProfilerScenario>();
foreach (var scenario in scenarios)
{
if (System.String.Equals(scenario.name, m_ScenarioName, System.StringComparison.OrdinalIgnoreCase))
{
GameDebug.Log("Profiling scenario: " + scenario.name);
m_CurrentScenario = scenario;
scenario.gameObject.SetActive(true);
break;
}
}
}
void UpdateActiveState()
{
}
void LeaveActiveState()
{
}
enum State
{
Loading,
Active
}
}
#endif