Объявление
public static void FlowEvent(uint flowId, Unity.Profiling.ProfilerFlowEventType flowEventType);Параметры
flowId | Идентификатор потока профилировщика. |
flowEventType | Тип события потока. |
Описание
Добавить событие потока в образец Profiler.
Используйте события потока Profiler, чтобы выделить зависимости между выполнением задачи в разных потоках.
Событие Flow работает в сочетании с ProfilerMarker.
using System;
using System.Threading;
using Unity.Profiling;
using Unity.Profiling.LowLevel;
using Unity.Profiling.LowLevel.Unsafe;
public class Example
{
public const int k_NumberOfTasks = 4;
static readonly ProfilerMarker k_ScheduleParallelTasksMarker = new ProfilerMarker("Schedule Parallel Tasks");
static readonly ProfilerMarker k_ParallelTaskMarker = new ProfilerMarker("Parallel Task");
static readonly ProfilerMarker k_TaskSyncMarker = new ProfilerMarker("Sync Task");
static void EmitFlowEventAndChainThread(uint flowId)
{
// Mark the next k_ParallelTaskMarker as a beginning of the flow
ProfilerUnsafeUtility.FlowEvent(flowId, ProfilerFlowEventType.ParallelNext);
using (k_ParallelTaskMarker.Auto())
{
// Do work
}
}
static void ScheduleParallelTask()
{
uint flowId;
var threads = new Thread[k_NumberOfTasks];
using (k_ScheduleParallelTasksMarker.Auto())
{
flowId = ProfilerUnsafeUtility.CreateFlow(ProfilerUnsafeUtility.CategoryScripts);
// Mark the parent k_ScheduleParallelTasksMarker as a beginning of the flow
ProfilerUnsafeUtility.FlowEvent(flowId, ProfilerFlowEventType.Begin);
for (var i = 0; i < k_NumberOfTasks; ++i)
{
var thread = new Thread(() => EmitFlowEventAndChainThread(flowId));
thread.Start();
threads[i] = thread;
}
}
using (k_TaskSyncMarker.Auto())
{
// Mark the parent k_TaskSyncMarker as a beginning of the flow
ProfilerUnsafeUtility.FlowEvent(flowId, ProfilerFlowEventType.End);
for (var i = 0; i < k_NumberOfTasks; ++i)
threads[i].Join();
}
}
}
Вы должны использовать FlowEvent
вместе с ProfilerMarker.
Чтобы пометить образец как начало или конец потока, используйте FlowEvent
с ProfilerFlowEventType.Begin и события ProfilerFlowEventType.End в области, которая управляется с помощью ProfilerMarker.Begin и ProfilerMarker.End или в рамках using
ProfilerMarker.Auto.
Чтобы пометить образец как точку продолжения потока, используйте FlowEvent
с ProfilerFlowEventType.Next и ProfilerFlowEventType.ParallelNext перед вызовом ProfilerMarker.Begin или ProfilerMarker.Auto.
Примечание. Unity Job System автоматически отмечает точки планирования, выполнения и ожидания заданий.
Смотрите так же: CreateFlow, CPU Usage Profiler module.