Performance¶
继承: Object
公开与性能相关的数据。
描述¶
此类提供对许多与性能相关的不同监视器的访问,例如内存使用、绘制调用和FPS。这些与编辑器的调试器面板中Monitor选项卡中显示的值相同。通过使用此类的get_monitor()方法,您可以从代码中访问这些数据。
您可以使用add_custom_monitor()方法添加自定义监视器。自定义监视器与内置监视器一起在编辑器的调试器面板的Monitor选项卡中可用。
注意:一些内置监视器仅在调试模式下可用,并且在发布模式下导出的项目中使用时将始终返回0。
注意:由于性能原因,一些内置监视器不会实时更新,因此更改之间可能会有长达1秒的延迟。
注意:自定义监视器不支持负值。负值被限制为0。
方法¶
void |
add_custom_monitor(id: StringName, callable: Callable, arguments: Array = []) |
get_monitor(monitor: Monitor) const |
|
void |
枚举¶
enum Monitor: 🔗
Monitor TIME_FPS = 0
上一秒渲染的帧数。此指标每秒仅更新一次,即使查询次数更多。越高越好。
Monitor TIME_PROCESS = 1
完成一帧所需的时间,以秒为单位。越低越好。
Monitor TIME_PHYSICS_PROCESS = 2
完成一个物理帧所需的时间,以秒为单位。越低越好。
完成一个导航步骤所需的时间,以秒为单位。这包括导航地图更新以及代理回避计算。越低越好。
Monitor MEMORY_STATIC = 4
当前使用的静态内存,以字节为单位。在发布版本中不可用。越低越好。
Monitor MEMORY_STATIC_MAX = 5
可用的静态内存。在发布版本中不可用。越低越好。
Monitor MEMORY_MESSAGE_BUFFER_MAX = 6
消息队列缓冲区使用的最大内存量,以字节为单位。消息队列用于延迟函数调用和通知。越低越好。
Monitor OBJECT_COUNT = 7
当前实例化的对象数量(包括节点)。越低越好。
Monitor OBJECT_RESOURCE_COUNT = 8
当前使用的资源数量。越低越好。
Monitor OBJECT_NODE_COUNT = 9
当前在场景树中实例化的节点数。这也包括根节点。越低越好。
Monitor OBJECT_ORPHAN_NODE_COUNT = 10
孤立节点的数量,即不属于场景树节点的节点。越低越好。
Monitor RENDER_TOTAL_OBJECTS_IN_FRAME = 11
最后渲染帧中的对象总数。此指标不包括剔除的对象(通过隐藏节点、截头体剔除或遮挡剔除)。越低越好。
Monitor RENDER_TOTAL_PRIMITIVES_IN_FRAME = 12
在上一帧中渲染的顶点或索引的总数。此指标不包括来自剔除对象的原语(通过隐藏节点、截头体剔除或遮挡剔除)。由于深度前置和阴影通道,原语的数量始终高于场景中的实际顶点数量(通常是原始顶点数量的两倍或三倍)。越低越好。
Monitor RENDER_TOTAL_DRAW_CALLS_IN_FRAME = 13
在最后呈现的帧中执行的绘制调用总数。此指标不包括剔除的对象(通过隐藏节点、截头体剔除或遮挡剔除),因为它们不会导致绘制调用。越低越好。
Monitor RENDER_VIDEO_MEM_USED = 14
使用的视频内存量(纹理和顶点内存组合,以字节为单位)。由于该指标还包括杂项分配,因此该值始终大于RENDER_TEXTURE_MEM_USED和RENDER_BUFFER_MEM_USED之和。越低越好。
Monitor RENDER_TEXTURE_MEM_USED = 15
使用的纹理内存量(以字节为单位)。越低越好。
Monitor RENDER_BUFFER_MEM_USED = 16
使用的渲染缓冲内存量(以字节为单位)。越低越好。
Monitor PHYSICS_3D_ACTIVE_OBJECTS = 20
应用中活跃的RigidBulk和VehicleBulk节点数。越低越好。
Monitor PHYSICS_3D_COLLISION_PAIRS = 21
3D物理引擎中的碰撞对数。越低越好。
Monitor PHYSICS_3D_ISLAND_COUNT = 22
3D物理引擎中的岛屿数量。越低越好。
Monitor AUDIO_OUTPUT_LATENCY = 23
AudioServer的输出延迟。相当于调用AudioServer.get_output_latency(),不建议每帧都调用它。
NavigationServer3D中活动导航地图的数量。这还包括由World2D和World3D创建的两个空的默认导航地图。
NavigationServer3D中的活动导航区域数。
NavigationServer3D中处理回避的活动导航代理的数量。
NavigationServer3D中的活动导航链接数。
NavigationServer3D中的导航网格多边形数。
NavigationServer3D中的导航网格多边形边缘数。
NavigationServer3D中由于边缘键重叠而合并的导航网格多边形边缘数。
通过边缘接近NavigationServer3D认为连接的多边形边缘数。
无法在NavigationServer3D中合并的导航网格多边形边缘的数量。边缘仍然可以通过边缘接近或链接连接。
NavigationServer3D中的活动导航障碍物数。
Monitor PIPELINE_COMPILATIONS_CANVAS = 34
由2D画布渲染器触发的管道编译数。
Monitor PIPELINE_COMPILATIONS_MESH = 35
由加载网格触发的管道编译数。这些编译将在用户第一次运行应用时显示为更长的加载时间并且需要管道。
Monitor PIPELINE_COMPILATIONS_SURFACE = 36
在渲染场景之前通过构建表面缓存触发的管道编译数。当用户第一次运行应用并且需要管道时加载场景时,这些编译将显示为口吃。
Monitor PIPELINE_COMPILATIONS_DRAW = 37
绘制场景时触发的管道编译数。当用户第一次运行应用并且需要管道时,这些编译将在运行时显示为口吃。
Monitor PIPELINE_COMPILATIONS_SPECIALIZATION = 38
为优化当前场景而触发的管道编译数。这些编译是在后台完成的,不应该导致任何口吃。
Monitor MONITOR_MAX = 39
表示Monitor枚举的大小。
方法说明¶
void add_custom_monitor(id: StringName, callable: Callable, arguments: Array = []) 🔗
添加一个名为id的自定义监视器。您可以使用id中的斜线分隔符指定监视器的类别(例如:"Game/NumberOfNPCs")。如果有多个斜线分隔符,则使用默认类别。默认类别是"Custom"。如果给定的id已存在,则会显示错误。
func _ready():
var monitor_value = Callable(self, "get_monitor_value")
# 将名为“我的名字”的监视器添加到“我的类别”这一分类中。
Performance.add_custom_monitor("MyCategory/MyMonitor", monitor_value)
# 将名为 "MyName" 的监视器添加到 "Custom" 类别中。
# Note: "MyCategory/MyMonitor" and "MyMonitor" have same name but different IDs, so the code is valid.
Performance.add_custom_monitor("MyMonitor", monitor_value)
# 将名为 "MyName" 的监视器添加到 "Custom" 类别中。
# Note: "MyMonitor" and "Custom/MyMonitor" have same name and same category but different IDs, so the code is valid.
Performance.add_custom_monitor("Custom/MyMonitor", monitor_value)
# 将名为 "MyCategoryOne/MyCategoryTwo/MyMonitor" 的监视器添加到 "Custom" 类别中。
Performance.add_custom_monitor("MyCategoryOne/MyCategoryTwo/MyMonitor", monitor_value)
func get_monitor_value():
return randi() % 25
public override void _Ready()
{
var monitorValue = new Callable(this, MethodName.GetMonitorValue);
// 将名为 "MyName" 的监视器添加到 "Custom" 类别中。
Performance.AddCustomMonitor("MyCategory/MyMonitor", monitorValue);
// Adds monitor with name "MyName" to category "Custom".
// Note: "MyCategory/MyMonitor" and "MyMonitor" have same name but different ids so the code is valid.
Performance.AddCustomMonitor("MyMonitor", monitorValue);
// 将名为 "MyName" 的监视器添加到 "Custom" 类别中。
// Note: "MyMonitor" and "Custom/MyMonitor" have same name and same category but different ids so the code is valid.
Performance.AddCustomMonitor("Custom/MyMonitor", monitorValue);
// 将名为 "MyCategoryOne/MyCategoryTwo/MyMonitor" 的监视器添加到 "Custom" 类别中。
Performance.AddCustomMonitor("MyCategoryOne/MyCategoryTwo/MyMonitor", monitorValue);
}
public int GetMonitorValue()
{
return S3.Randi() % 25;
}
调试器调用可调用对象以获取自定义监视器的值。该可调用对象必须返回一个零或正整数或浮点数。可调用对象使用参数数组中的参数进行调用。
Variant get_custom_monitor(id: StringName) 🔗
使用给定的id返回自定义监视器的值。调用可调用对象以获取自定义监视器的值。另请参见has_custom_monitor()。如果给定的id不存在,则打印错误。
Array[StringName] get_custom_monitor_names() 🔗
返回Array中活动自定义监视器的名称。
float get_monitor(monitor: Monitor) const 🔗
返回可用的内置监视器之一的值。你应该提供Monitor常量之一作为参数,如下所示:
print(Performance.get_monitor(Performance.TIME_FPS)) # Prints the FPS to the console.
S3.Print(Performance.GetMonitor(Performance.Monitor.TimeFps)); // Prints the FPS to the console.
请参阅 get_custom_monitor() 以查询自定义性能监视器的值
int get_monitor_modification_time() 🔗
返回添加/删除自定义监视器的最后一个刻度(以引擎启动后的微秒为单位)。这在监视器更新时设置为Time.get_ticks_usec()。
bool has_custom_monitor(id: StringName) 🔗
如果存在具有给定id的自定义监视器,则返回true,否则返回false。
void remove_custom_monitor(id: StringName) 🔗
删除具有给定id的自定义监视器。如果给定id已经不存在,则打印错误。