测量 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 中的分析器。
类别 |
配置名称 |
剖析程序 |
|---|---|---|
应用程序初始化 |
|
|
默认资源注册 |
|
|
图像初始化 |
|
|
启动 kzb 文件打开 |
|
|
加载线程初始化 |
|
|
元数据注册 |
|
|
插件加载 |
|
|
预设件加载 |
|
|
预设件安装 |
|
|
预设件附加 |
|
|
渲染器重置 |
|
|
运行时资产注册 |
|
|
域初始化 |
|
|
|
||
|
||
|
主循环分析器¶
主循环剖析程序测量 Kanzi Engine 在 Kanzi 主循环的每次迭代中用于不同任务的时间。您可以通过在应用程序配置中添加 MainLoop 类别来启用主循环剖析程序。请参阅 ProfilingCategoryFilter。
您可以通过主循环调度器接口 MainLoopScheduler::getProfiler 访问主循环分析器。您可以使用 Application::getMainLoopScheduler 从 Application 访问主循环调度器。
在 Performance HUD 中,您可以显示主循环任务的性能测量图表。请参阅 在 Performance HUD 中显示性能测量图表。。
在应用程序配置中,您可以设置主循环性能剖析程序中采样缓冲区的大小。请参阅 主循环剖析样本缓冲区计数。
在 Performance HUD 中显示性能测量图表。¶
您可以在 Profiling build 中显示任何主循环任务的性能剖析图表,包括您在应用程序代码中添加的自定义任务。
要在 Performance HUD 中显示性能测量图:
在应用程序配置中,启用显示完整的 Performance HUD:
在
application.cfg:PerformanceInfoLevel = 2
在
Application::onConfigure函数中:configuration.performanceInfoLevel = ApplicationProperties::PerformanceInfoLevelFull;
请参阅 应用程序开发 和 PerformanceInfoLevel。
(可选) 您可以为 Performance HUD 设置字号。
在
application.cfg:PerformanceInfoFontSize = 14
在
Application::onConfigure函数中:configuration.performanceInfoProperties.fontSize = 14;
在应用程序配置中启用主循环剖析类别。
在
application.cfg:ProfilingCategoryFilter="MainLoop=on"
在
Application::onConfigure函数中:configuration.profilingCategoryFilter = "MainLoop=on";
在应用程序配置中,为要显示的任务启用图表。有关默认主循环任务的名称,请参阅
Application::initializeMainLoopTasks的定义。例如,要显示任务 TickAnimations 和 Render 的图表,请设置:
在
application.cfg:PerformanceInfoGraphFilter="TickAnimations;Render"
在
Application::onConfigure函数中:configuration.performanceInfoProperties.graphFilter = "TickAnimations;Render";
(可选) 设置 Kanzi 用于绘制 Performance HUD 的颜色:
在 Visual Studio 中,在您要设置颜色的文件中,包含
performance_info.hpp头文件。例如,要设置 Kanzi 用于绘制 滚动视图示例 的 Performance HUD 的颜色,在
scroll_view.cpp文件中添加:#include <kanzi/core.ui/application/performance_info.hpp>
设置 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));
构建并运行您的应用程序。请参阅 部署 Kanzi 应用程序。
要显示性能图,您必须使用 Kanzi 的 Profiling build。
例如,在 Windows 中使用 Profiling 构建配置在 Visual Studio 中构建您的应用程序。
当您运行应用程序时,Performance HUD 显示性能测量图表。
如果您看不到这些图表,请放大应用程序窗口。
记录 Kanzi Engine 性能分析数据¶
要分析 Kanzi Engine 的性能,记录性能剖析数据。
记录启动性能信息¶
您可以在 Profiling build 中使用 Kanzi 启动性能分析器来测量 Kanzi Engine 在应用程序启动期间花费在不同任务上的时间。请参阅 启动性能剖析类别。
要记录启动性能信息,使用 Profiling build 配置构建您的应用程序。
例如,要在 Windows 上构建并运行您的应用程序:
在 Visual Studio 中使用 Profiling 构建配置构建您的应用程序。
打开您计算机上的命令行,然后运行应用程序,将应用程序输出导向要存储性能测量数据的文件。
<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::logAllData函数。例如,要记录来自主循环剖析程序的所有数据,请使用:
getMainLoopScheduler().getProfiler()->logAllData();
要记录分析器数据的摘要,请使用
AbstractProfiler::logAggregateData函数。请注意,并非所有分析器都实现了聚合日志记录。例如,要记录来自
StartupProfilerRegistry的StartupProfilerRegistry::m_initializationProfiler的数据摘要,使用:getStartupProfilerRegistry().m_initializationProfiler->logAggregateData();
记录来自剖析程序注册表的数据¶
您可以通过在剖析程序中迭代并调用 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();
}
}