排除应用程序性能问题¶
Kanzi 提供了不同的方法来测量应用程序的性能,并显示各种性能参数。使用这些方法和参数来提高应用程序的性能。
在 Kanzi Studio 中查看应用程序性能¶
要在 Kanzi Studio 中分析应用程序的性能和内部结构, 在 Preview 中单击
以进入 Analyze 模式,右键单击
,然后选择:
Performance HUD 显示了您的 Kanzi 应用程序在最近 500 帧中的整体性能指标,包括:
Frame Duration (ms) 显示渲染最后一帧所用的时间(以毫秒为单位),以及平均、最高和最低时间。
Frame Duration (ms) 图中的顶部值显示了渲染最后 500 帧中最长的一帧所用的时间,底部值显示了平均渲染一帧所用的时间。
使用此信息来识别您的 Kanzi 应用程序中的性能瓶颈。例如,您可以使用它通过将渲染分布在多个帧上来找出如何提高应用程序的性能。请参阅 在多个帧之间分配渲染。
Frames Per Second 显示每秒渲染的帧数。
Animation Duration (μs) 以微秒为单位显示执行应用程序中最近一帧的所有动画所需的时间及平均、最高和最低耗时。
Batch Count 显示了执行了多少个单独的绘制调用(
glDrawElements和glDrawArrays)。您可以通过调用
Renderer::getBatchCount使用 Kanzi Engine API 访问批处理计数。Batch Count 图中的顶部值显示了在最近 500 帧中批次的最高数量,底部值显示了最后一帧中的批次数量。
Triangle Count 显示在一帧中总共绘制了多少个独立的三角形。
您可以通过调用
Renderer::getTriangleCount在 Kanzi Engine API 中访问三角形计数。Texture Switches 显示了新纹理绑定到 GPU 的次数。
您可以通过调用
Renderer::getTextureSwitchCount在 Kanzi Engine API 中访问纹理切换计数。FBO Switches 显示绑定到 GPU 的帧缓冲对象的数量。请参阅 渲染最佳实践。
您可以通过调用
Renderer::getFramebufferSwitchCount在 Kanzi Engine API 中访问缓冲区切换计数。Shader 显示了为新应用的批次绑定新着色器的次数以及为上一帧发送的单个着色器统一变量的数量。请参阅 减少着色器切换。
您可以通过调用
Renderer::getShaderSwitchCount在 Kanzi Engine API 中访问着色器切换计数。您可以通过调用
Renderer::getUniformSendCount来访问在 Kanzi Engine API 中发送的 uniforms。Buffer Switches 显示了绑定到 GPU 的顶点、索引和统一缓冲区对象的数量。
您可以通过调用
Renderer::getBufferSwitchCount在 Kanzi Engine API 中访问缓冲区切换计数。Buffer and Texture Data Updates 显示了新的顶点缓冲区或纹理数据上传到 GPU 的次数。如果同一个缓冲区被用于写入和读取操作,这些繁重的操作可能会导致 GPU 执行延迟。理想值是 0。
例如,当文本字形缓存需要频繁更新时,该值可能会增加。在这种情况下,要减少字形缓存更新,请降低 Text Block 节点中 Font Size 属性的值。
您可以通过调用
Renderer::getHeavyweightCallCount在 Kanzi Engine API 中访问此内容。View Camera 显示用于在您的应用程序中显示场景的 Camera 节点的名称。
Resource Memory Use 显示您的 Kanzi 应用程序使用的本地 GPU 内存 (VRAM) 和非本地 GPU 内存 (RAM) 的估计量。
Performance HUD 在 Kanzi Studio Preview 中显示的值与您在目标设备上运行 Kanzi 应用程序时的值不同,因为 Kanzi Studio 会加载并在内存中保留应用程序中的所有资源。
Timers 显示
MainLoopScheduler中已注册的计时器处理程序的数量。计时器处理程序过多可能会降低应用程序的性能。请参阅 添加计时器。您可以通过调用
MainLoopScheduler::getTimersCount在 Kanzi Engine API 中访问计时器订阅的数量。Recurring Tasks 显示添加到主循环调度器各阶段的任务总数。Kanzi Engine 默认会添加一些任务。请参阅 添加重复任务。
您可以通过调用
MainLoopScheduler::getTasksTotalCount在 Kanzi Engine API 中访问重复任务的数量。Animations 显示了您的 Kanzi 应用程序中活动动画和所有动画的数量。
您可以在 Kanzi Engine API 中访问动画的数量:
要获取活动动画的数量,使用
TimelineClock::getActiveTimelinePlaybackCount。要获取所有动画的数量,请使用
TimelineClock::getTimelinePlaybackCount。
Framebuffer objects 用半透明的黄色移动条纹标记节点,这些节点被渲染到纹理中并导致帧缓冲对象切换。
Transparency 用半透明的蓝色移动条纹标记透明节点。请参阅 配置节点以实现高效渲染。
Overdraw 可视化表示 Kanzi 多次渲染到同一像素的区域。较浅的绿色表示较高的过度绘制量。
查看整体性能¶
要查看您的 Kanzi 应用程序的整体性能:
在 Kanzi Studio Preview 中,点击
,并在上下文菜单中启用 Performance HUD。在
application.cfg中,启用完整 Performance HUD 的显示:PerformanceInfoLevel = 2
请参阅 PerformanceInfoLevel。
在
Application::onConfigure函数中启用应用程序代码中 Performance HUD 的显示。configuration.performanceInfoLevel = ApplicationProperties::PerformanceInfoLevelFull;
请参阅 PerformanceInfoLevel。
在
application.hpp中,通过调用Application::getPerformanceInfoLevel和Application::setPerformanceInfoLevel函数启用 Performance HUD 的显示:ApplicationProperties::PerformanceInfoLevel getPerformanceInfoLevel() const { return m_applicationProperties.performanceInfoLevel; } void setPerformanceInfoLevel(ApplicationProperties::PerformanceInfoLevel level) { m_applicationProperties.performanceInfoLevel = level; }
要将帧率值写入日志文件,您可以通过在
application.hpp中调用Application::getFramesPerSecond函数,从 Kanzi Engine 中检索当前帧率值。您可以通过调用Application::getEngine从应用程序中检索 Kanzi Engine。要获取渲染一帧所需的时间,使用
MainLoopScheduler计时接口MainLoopScheduler::getLastFrameDuration。
请参阅 应用程序配置参考。
查看资源的加载时间¶
在 application.cfg 文件中或在 Application::onConfigure 函数的应用程序代码中,您可以设置 Kanzi 以打印到调试控制台,显示加载应用程序使用的资源 kzb 文件所需的时间。请参阅 测量资源的加载和部署时间。
查看图形性能¶
在 application.cfg 文件中或在 Application::onConfigure 函数的应用程序代码中,您可以设置 Kanzi 以打印到调试控制台:
应用程序启动时的图形相关信息,例如 GL 渲染器、版本和着色语言版本。请参阅 LogOpenGLInformation。
应用程序启动时的图形相关扩展列表。请参阅 LogOpenGLExtensions。
应用程序启动时的图形相关属性的列表,例如交换行为、显示大小以及您应用程序的大小。请参阅 LogSurfaceInformation。
您的应用程序的图形 API 调用日志。请参阅 GraphicsLoggingEnabled。
查看节点的过度绘制¶
Overdraw 可视化表示 Kanzi 多次渲染到同一像素的区域。较浅的绿色表示较高的过度绘制量。
Kanzi 使用模板缓冲区来计算它绘制到同一像素的次数。如果您使用模板缓冲区来渲染内容,Overdraw 可视化可能会返回意外结果。
过度绘制可视化不显示:
对您渲染到合成的3D节点进行过度绘制,然后将其渲染到纹理。在这种情况下,Overdraw 可视化将您渲染到纹理的合成内容显示为单个四边形。
当您在其祖先节点中将 Clip Children 属性设置为启用时,被裁剪的节点部分。
完全透明的节点或不可见的节点,包括它们的子节点。
要在您的应用程序中查看过度绘制,请在 Kanzi Studio Preview 中单击
以进入 Analyze 模式,右键单击
,然后选择 Overdraw。
查看渲染到纹理中的节点¶
在某些平台上,在帧缓冲对象之间切换可能会导致显著的性能下降。Kanzi 将节点渲染到纹理中的条件可能很复杂。例如,旋转、缩放或不透明度可能会导致渲染到纹理的发生。
要查看节点是否渲染到纹理中,并导致帧缓冲对象切换,请在 Preview 中单击
进入 Analyze 模式,右键单击
,然后选择 Framebuffer objects。Preview 用透明的橙色条纹突出显示渲染到纹理中的图层。
查看渲染为合成渲染目标的节点¶
在 Kanzi Studio 中,您可以看到应用程序中的哪些2D节点被 Kanzi 渲染到合成渲染目标。
要在 Preview 中查看在 Preview 中使用 alpha 混合的 2D 节点,请单击
进入 Analyze 模式,右键单击
,然后选择 Transparency。
Preview 突出显示了 Kanzi 渲染到具有半透明蓝色条纹的合成渲染目标的节点。