测量 Kanzi Engine 的性能

使用 Profiling build 来测量 Kanzi Engine 不同部分的性能。此构建包括分析过的 Kanzi 库。

Profiling build 中的性能分析类别

Profiling build 提供了性能分析类别和分析器,您可以使用它们来测量 Kanzi Engine 不同部分的性能:

  • 启动 性能分析器测量 Kanzi 在应用程序启动期间使用的时间。

    例如,使用启动性能剖析程序测量初始化应用程序、打开启动 kzb 文件和加载插件所花的时间。

    请参阅 启动性能剖析类别。

  • Main loop 分析器测量 Kanzi 在主循环中运行的任务所用的时间。您可以使用此功能来找出影响应用程序帧率的因素。

    例如,使用主循环剖析程序测量处理输入事件、计算布局、运行动画、更新应用程序状态和渲染节点花费的时间。

    请参阅 主循环分析器。

启动性能剖析类别

启动性能分析器测量 Kanzi Engine 在应用程序启动期间执行不同任务所花费的时间。启动性能分析器在 StartupProfilerRegistry 中注册。默认情况下,所有启动性能分析类别均已启用。要在应用程序配置中设置类别的状态,请使用 Configuration name。请参阅 ProfilingCategoryFilter。

此表列出了 Kanzi 启动性能分析类别和包含在 Profiling build 中的分析器。

类别

配置名称

剖析程序

应用程序初始化

StartupInitialization

StartupProfilerRegistry::m_initializationProfiler

默认资源注册

StartupRegisterDefaultResources

StartupProfilerRegistry::m_registerDefaultResourcesProfiler

图像初始化

StartupInitializeGraphics

StartupProfilerRegistry::m_initializeGraphicsProfiler

启动 kzb 文件打开

StartupOpenKzb

StartupProfilerRegistry::m_openKzbProfiler

加载线程初始化

StartupInitializeLoadingThreads

StartupProfilerRegistry::m_initializeLoadingThreadsProfiler

元数据注册

StartupRegisterMetadata

StartupProfilerRegistry::m_registerMetadataProfiler

插件加载

StartupLoadPlugins

StartupProfilerRegistry::m_loadPluginsProfiler

预设件加载

StartupLoadPrefab

StartupProfilerRegistry::m_loadPrefabProfiler

预设件安装

StartupInstantiatePrefab

StartupProfilerRegistry::m_instantiatePrefabProfiler

预设件附加

StartupAttachPrefab

StartupProfilerRegistry::m_attachPrefabProfiler

渲染器重置

StartupResetRenderer

StartupProfilerRegistry::m_resetRendererProfiler

运行时资产注册

StartupRegisterRuntimeAssets

StartupProfilerRegistry::m_registerRuntimeAssetsProfiler

域初始化

StartupInitializeDomain

StartupProfilerRegistry::m_initializeDomainProfiler

Application::onProjectLoaded

StartupOnProjectLoaded

StartupProfilerRegistry::m_onProjectLoadedProfiler

Application::initializeGL

StartupInitializeGL

StartupProfilerRegistry::m_initializeGLProfiler

Application::resumeGL

StartupResumeGL

StartupProfilerRegistry::m_resumeGLProfiler

主循环分析器

主循环剖析程序测量 Kanzi Engine 在 Kanzi 主循环的每次迭代中用于不同任务的时间。您可以通过在应用程序配置中添加 MainLoop 类别来启用主循环剖析程序。请参阅 ProfilingCategoryFilter。

您可以通过主循环调度器接口 MainLoopScheduler::getProfiler 访问主循环分析器。您可以使用 Application::getMainLoopScheduler 从 Application 访问主循环调度器。

在 Performance HUD 中,您可以显示主循环任务的性能测量图表。请参阅 在 Performance HUD 中显示性能测量图表。。

在应用程序配置中,您可以设置主循环性能剖析程序中采样缓冲区的大小。请参阅 主循环剖析样本缓冲区计数。

在 Performance HUD 中显示性能测量图表。

您可以在 Profiling build 中显示任何主循环任务的性能剖析图表,包括您在应用程序代码中添加的自定义任务。

要在 Performance HUD 中显示性能测量图:

  1. 在应用程序配置中,启用显示完整的 Performance HUD:

    • 在 application.cfg:

      PerformanceInfoLevel = 2
      
    • 在 Application::onConfigure 函数中:

      configuration.performanceInfoLevel = ApplicationProperties::PerformanceInfoLevelFull;
      

    请参阅 应用程序开发 和 PerformanceInfoLevel。

  2. (可选) 您可以为 Performance HUD 设置字号。

    • 在 application.cfg:

      PerformanceInfoFontSize = 14
      
    • 在 Application::onConfigure 函数中:

      configuration.performanceInfoProperties.fontSize = 14;
      

    请参阅 PerformanceInfoFontSize。

  3. 在应用程序配置中启用主循环剖析类别。

    • 在 application.cfg:

      ProfilingCategoryFilter="MainLoop=on"
      
    • 在 Application::onConfigure 函数中:

      configuration.profilingCategoryFilter = "MainLoop=on";
      

    请参阅 ProfilingCategoryFilter。

  4. 在应用程序配置中,为要显示的任务启用图表。有关默认主循环任务的名称,请参阅 Application::initializeMainLoopTasks 的定义。

    例如,要显示任务 TickAnimations 和 Render 的图表,请设置:

    • 在 application.cfg:

      PerformanceInfoGraphFilter="TickAnimations;Render"
      
    • 在 Application::onConfigure 函数中:

      configuration.performanceInfoProperties.graphFilter = "TickAnimations;Render";
      

    请参阅 PerformanceInfoGraphFilter。

  5. (可选) 设置 Kanzi 用于绘制 Performance HUD 的颜色:

    1. 在 Visual Studio 中,在您要设置颜色的文件中,包含 performance_info.hpp 头文件。

      例如,要设置 Kanzi 用于绘制 滚动视图示例 的 Performance HUD 的颜色,在 scroll_view.cpp 文件中添加:

      #include <kanzi/core.ui/application/performance_info.hpp>
      
    2. 设置 Kanzi 用于显示 Performance HUD 图形框架、图形数据和文本的颜色。

      例如:在 scroll_view.cpp 文件中的 Application::onProjectLoaded 函数中添加:

      // Get the performanceInfo object. If the object does not exist, create it.
      PerformanceInfo& performanceInfo = acquirePerformanceInfo();
      // Set the color of graph frames to gray.
      performanceInfo.setBorderColor(ColorRGBA(0.5f, 0.5f, 0.5f));
      // Set the color of graph data to yellow.
      performanceInfo.setLineColor(ColorRGBA(1.0f, 1.0f, 0.0f));
      // Set the color of text to black.
      performanceInfo.setFontColor(ColorRGBA(0.0f, 0.0f, 0.0f));
      
  6. 构建并运行您的应用程序。请参阅 部署 Kanzi 应用程序。

    要显示性能图,您必须使用 Kanzi 的 Profiling build。

    例如,在 Windows 中使用 Profiling 构建配置在 Visual Studio 中构建您的应用程序。

    ../../_images/profiling-configuration.png

当您运行应用程序时,Performance HUD 显示性能测量图表。

如果您看不到这些图表,请放大应用程序窗口。

../../_images/main-loop-rendering-and-layout-in-hud.png

记录 Kanzi Engine 性能分析数据

要分析 Kanzi Engine 的性能,记录性能剖析数据。

记录启动性能信息

您可以在 Profiling build 中使用 Kanzi 启动性能分析器来测量 Kanzi Engine 在应用程序启动期间花费在不同任务上的时间。请参阅 启动性能剖析类别。

要记录启动性能信息,使用 Profiling build 配置构建您的应用程序。

例如,要在 Windows 上构建并运行您的应用程序:

  1. 在 Visual Studio 中使用 Profiling 构建配置构建您的应用程序。

    ../../_images/profiling-configuration.png
  2. 打开您计算机上的命令行,然后运行应用程序,将应用程序输出导向要存储性能测量数据的文件。

    <MyProject>\Application\bin> ..\build_vs<Version>\runtime\Profiling\MyApplication.exe > MyApplicationProfiling.log
    

Kanzi 将启动性能测量信息写入日志。

...
info:profiling> Startup profiling:
info:profiling> StartupInitialization                        335 981 800 ns
info:profiling> |-- StartupInitializeGraphics                304 665 900 ns
info:profiling> |-- StartupCreateDomain                        1 450 500 ns
info:profiling> |-- StartupInitializeLoadingThreads           26 921 700 ns
info:profiling> |-- StartupRegisterRuntimeAssets                 122 800 ns
info:profiling> |-- StartupLoadPlugins                               200 ns
info:profiling> |-- StartupRegisterMetadata                      776 100 ns
info:profiling> |-- StartupOpenKzb                             1 106 000 ns
info:profiling> StartupInitializeGL                                  100 ns
info:profiling> StartupResumeGL                                1 316 800 ns
info:profiling> StartupLoadPrefab                            808 960 000 ns
info:profiling> StartupInstantiatePrefab                       1 351 700 ns
info:profiling> StartupRegisterDefaultResources                   17 400 ns
info:profiling> StartupAttachPrefab                           16 614 700 ns
info:profiling> StartupResetRenderer                              59 700 ns
info:profiling> StartupOnProjectLoaded                            38 600 ns
info:profiling> Startup profiling data logging took   1 712 800 ns
...

记录来自剖析程序的数据

您可以记录来自特定剖析程序的数据:

记录来自剖析程序注册表的数据

您可以通过在剖析程序中迭代并调用 AbstractProfiler::logAggregateData 或 AbstractProfiler::logAllData 函数,从注册在特定剖析程序注册表中的所有剖析程序记录数据。

例如,要在退出应用程序时记录来自您的自定义剖析程序的性能剖析数据摘要:

// Kanzi calls this function when the application exits.
void onShutdown() override
{
    // Get the default profiler registry.
    const auto& registry = kzProfilingGetDefaultRegistry();

    // Go through all profilers in the registry and log their aggregate data.
    for (auto profilerIter = registry.beginProfilers(),
        profilerIterEnd = registry.endProfilers();
        profilerIter != profilerIterEnd; ++profilerIter)
    {
        (*profilerIter)->logAggregateData();
    }
}

另请参阅

测量应用程序性能

测量您的应用程序代码的性能

应用程序开发