版本:Unity 6 (6000.0)
语言:English
自定义 Profiler
创建自定义 Profiler 模块

创建自定义 Profiler 计数器

要在 Unity 探查器一个帮助你优化游戏的窗口。它显示了游戏各个领域所花费的时间。例如,它可以报告渲染、动画或游戏逻辑所花费的时间百分比。更多信息
参见 词汇表
中显示自定义指标,必须在Unity Profiling Core 包中使用 ProfilerCounter API。

您可以使用 Profiling Core API 来跟踪应用程序中的指标。您可以将计数器跟踪的信息显示在 Unity Profiler 中。使用自定义Profiler 计数器使用 ProfilerCounter API 在代码中放置,用于跟踪指标,例如游戏中生成的敌人数量。更多信息
参见 词汇表
来比较系统指标并在 Profiler 窗口中识别性能问题。

自定义 Profiler 计数器可以显示来自 ProfilerCounterProfilerCounterValue 的数据。

有关使用 Unity Profiling Core API 创建 Profiler 计数器的完整指南,请参阅Profiler 计数器 API 指南

要添加探查器计数器,请创建脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性并以任何您喜欢的方式响应用户输入。更多信息
参见 词汇表
以执行以下操作

这些部分中的代码示例将 Profiler 计数器添加到跟踪每个 游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路点等。游戏对象的功效由附加到它的组件定义。更多信息
参见 词汇表
的轨迹效果的 Unity 创建的粒子总数。在这些示例中,游戏对象的名称为“Tank”。

定义计数器

要创建新的计数器,请编写脚本以定义新计数器的值类型,并为该类型分配名称和单位。

创建计数器时,必须指定新计数器属于哪个Profiler 类别。为此,请使用现有的 Unity 类别。例如,下面的脚本示例使用现有的 ProfilerCategory.Scripts 类别。有关更多信息,请参阅使用 Profiler 类别

以下示例脚本定义了ProfilerCounterValue TankTrailParticleCount,名称为“Tank Trail Particles”。此计数器的单位为“Count”

 
 public static class GameStats
 {
    public static readonly ProfilerCategory TanksCategory = ProfilerCategory.Scripts;

    public const string TankTrailParticleCountName = "Tank Trail Particles";
    public static readonly ProfilerCounterValue<int> TankTrailParticleCount =
        new ProfilerCounterValue<int>(TanksCategory, TankTrailParticleCountName, ProfilerMarkerDataUnit.Count,
            ProfilerCounterOptions.FlushOnEndOfFrame | ProfilerCounterOptions.ResetToZeroOnFlush);
}

选项 FlushOnEndOfFrameResetToZeroOnFlush 会自动将计数器发送到 Profiler 数据流并在帧末将 Count 值重置为零。

使用 Profiler 类别

Unity 会根据计数器分析的工作类型(例如渲染、脚本或动画)自动将 Profiler 计数器分组到类别中。您可以将自定义 Profiler 计数器分配到任何 Unity 的分析类别。有关可用 Profiler 类别的完整列表,请参阅ProfilerCategory

将 Profiler 计数器分配到 Profiler 类别

Profiler 计数器必须属于 Profiler 类别。在定义计数器时,应将类别分配给 Profiler 计数器。为此,请使用 ProfilerModule 的可选 autoEnabledCategoryNames 构造函数参数将一个或多个类别分配给 Profiler 计数器。在以下示例代码中有一个此方法的示例


 using Unity.Profiling;
 using Unity.Profiling.Editor;

 [System.Serializable]
 [ProfilerModuleMetadata("Tank Effects")] 
 public class TankEffectsProfilerModule : ProfilerModule
 {
    static readonly ProfilerCounterDescriptor[] k_Counters = new ProfilerCounterDescriptor[]
    {
        new ProfilerCounterDescriptor(GameStatistics.TankTrailParticleCountName, GameStatistics.TanksCategory),
        new ProfilerCounterDescriptor(GameStatistics.ShellExplosionParticleCountName, GameStatistics.TanksCategory),
        new ProfilerCounterDescriptor(GameStatistics.TankExplosionParticleCountName, GameStatistics.TanksCategory),
    };

    // Ensure that both ProfilerCategory.Scripts and ProfilerCategory.Memory categories are enabled when our module is active.
    static readonly string[] k_AutoEnabledCategoryNames = new string[]
    {
        ProfilerCategory.Scripts.Name,
        ProfilerCategory.Memory.Name
    };


    // Pass the auto-enabled category names to the base constructor.
    public TankEffectsProfilerModule() : base(k_Counters, autoEnabledCategoryNames: k_AutoEnabledCategoryNames) { }
}

更新计数器的值

要更新计数器的值,请创建一个 MonoBehaviour 脚本,该脚本设置您已定义的计数器的值。有关更多信息,请参阅如何将计数器值传递到 Profiler

更新计数器值的脚本示例

此示例 MonoBehaviour 脚本在 Update 函数中每帧计算属于分配的游戏对象的轨迹粒子的数量。为此,它使用名为 TankTrailParticleCount 的计数器。

以下示例脚本还在检查器一个 Unity 窗口,显示有关当前选定的游戏对象、资源或项目设置的信息,允许您检查和编辑值。更多信息
参见 词汇表
中创建了一个名为轨迹粒子系统一个组件,通过在场景中生成和动画处理大量小的 2D 图像来模拟流体实体,如液体、云和火焰。更多信息
参见 词汇表
m_TrailParticleSystem)的公共属性。


 using UnityEngine;

 class TankMovement : MonoBehaviour
 {
    public ParticleSystem m_TrailParticleSystem;

    void Update()
    {
        GameStats.TankTrailParticleCount.Value += m_TrailParticleSystem.particleCount;
    }
 }

使用 Profiler 计数器分析发布版本

在发布播放器中运行项目时,您无法访问 Profiler 窗口。但是,您可以将计数器作为UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三个 UI 系统。更多信息
参见 词汇表
元素显示在发布播放器中。这意味着您可以在发布的应用程序中包含分析工具。为此,请参阅Profiler 计数器 API 指南 中的获取播放器中的计数器值

下图显示了在发布播放器中使用自定义 UI 在场景的左上角显示的计数器

自定义 Profiler
创建自定义 Profiler 模块