RenderingServer.get_rendering_info
最后同步日期:2026-04-15 | Godot 官方原文 — RenderingServer.get_rendering_info
RenderingServer.get_rendering_info
定义
RenderingServer.get_rendering_info() 是底层渲染服务器提供的方法,用于查询渲染引擎的实时统计信息,比如当前帧画了多少个物体、使用了多少次绘制调用(draw call)、纹理占用了多少显存等。
你可以把它理解为引擎的"体检报告"——通过它你可以了解渲染引擎的实时工作状态,这对于性能分析和优化非常有用。比如游戏卡顿时,你可以查看是不是物体太多、draw call 太高,或者纹理占用了过多显存。
函数签名
public static long GetRenderingInfo(RenderingServer.RenderingInfo info = RenderingServer.RenderingInfo.TotalObjectsInFrame)func get_rendering_info(info: RenderingServer.RenderingInfo = RenderingServer.RENDERING_INFO_TOTAL_OBJECTS_IN_FRAME) -> int参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
info | RenderingServer.RenderingInfo(枚举) | 否 | 要查询的渲染信息类型。默认为 TotalObjectsInFrame(当前帧渲染的物体总数) |
RenderingInfo 枚举常用值
| 枚举值 | 说明 |
|---|---|
TotalObjectsInFrame | 当前帧渲染的物体总数 |
TotalPrimitivesInFrame | 当前帧渲染的图元(三角形等)总数 |
TotalDrawCallsInFrame | 当前帧的绘制调用(draw call)总数 |
TextureMemUsed | 纹理占用的显存(字节) |
BufferMemUsed | 缓冲区占用的显存(字节) |
VideoMemUsed | 总显存占用(字节) |
返回值
类型: long(C#)/ int(GDScript)
返回所请求的渲染统计信息数值。具体含义取决于传入的枚举参数。
代码示例
基础用法:查询当前帧的渲染统计
using Godot;
public partial class RenderingStatsLogger : Node
{
private Label _statsLabel;
public override void _Ready()
{
_statsLabel = new Label();
_statsLabel.Position = new Vector2(10, 10);
_statsLabel.Modulate = new Color(1f, 1f, 0f);
AddChild(_statsLabel);
}
public override void _Process(double delta)
{
var objects = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.TotalObjectsInFrame);
var drawCalls = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.TotalDrawCallsInFrame);
var primitives = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.TotalPrimitivesInFrame);
_statsLabel.Text = $"物体: {objects} | Draw Calls: {drawCalls} | 图元: {primitives}";
// 显示类似: 物体: 156 | Draw Calls: 89 | 图元: 42350
}
}extends Node
var _stats_label: Label
func _ready():
_stats_label = Label.new()
_stats_label.position = Vector2(10, 10)
_stats_label.modulate = Color(1, 1, 0)
add_child(_stats_label)
func _process(_delta: float) -> void:
var objects = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_OBJECTS_IN_FRAME)
var draw_calls = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME)
var primitives = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_PRIMITIVES_IN_FRAME)
_stats_label.text = "物体: %d | Draw Calls: %d | 图元: %d" % [objects, draw_calls, primitives]
# 显示类似: 物体: 156 | Draw Calls: 89 | 图元: 42350实际场景:完整的性能监控面板
using Godot;
/// <summary>
/// 一个简易的渲染性能监控面板,显示帧率、显存、绘制调用等信息。
/// 按 F3 键切换显示/隐藏。
/// </summary>
public partial class PerformanceOverlay : CanvasLayer
{
private RichTextLabel _panel;
private double _updateTimer = 0;
public override void _Ready()
{
_panel = new RichTextLabel();
_panel.Position = new Vector2(10, 10);
_panel.Size = new Vector2(380, 220);
_panel.BbcodeEnabled = true;
_panel.Modulate = new Color(1f, 1f, 1f, 0.85f);
var styleBox = new StyleBoxFlat();
styleBox.BgColor = new Color(0, 0, 0, 0.7f);
styleBox.SetContentMarginAll(8);
_panel.AddThemeStyleboxOverride("normal", styleBox);
AddChild(_panel);
}
public override void _Process(double delta)
{
// 每 0.25 秒更新一次(不需要每帧更新文本)
_updateTimer += delta;
if (_updateTimer < 0.25) return;
_updateTimer = 0;
var fps = (int)Engine.GetFramesPerSecond();
var objects = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.TotalObjectsInFrame);
var drawCalls = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.TotalDrawCallsInFrame);
var primitives = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.TotalPrimitivesInFrame);
var videoMem = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.VideoMemUsed);
var textureMem = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.TextureMemUsed);
var bufferMem = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.BufferMemUsed);
// 格式化显存(转换为 MB)
var videoMemMB = videoMem / (1024.0 * 1024.0);
var textureMemMB = textureMem / (1024.0 * 1024.0);
var bufferMemMB = bufferMem / (1024.0 * 1024.0);
var fpsColor = fps >= 55 ? "green" : fps >= 30 ? "yellow" : "red";
_panel.Clear();
_panel.AppendText($"[b]渲染性能监控[/b]\n");
_panel.AppendText($"[color={fpsColor}]FPS: {fps}[/color]\n");
_panel.AppendText($"\n");
_panel.AppendText($"渲染物体: {objects}\n");
_panel.AppendText($"Draw Calls: {drawCalls}\n");
_panel.AppendText($"图元数量: {primitives:N0}\n");
_panel.AppendText($"\n");
_panel.AppendText($"显存总量: {videoMemMB:F1} MB\n");
_panel.AppendText($"纹理占用: {textureMemMB:F1} MB\n");
_panel.AppendText($"缓冲占用: {bufferMemMB:F1} MB\n");
}
public override void _UnhandledInput(InputEvent ev)
{
if (ev is InputEventKey { Pressed: true, Keycode: Key.F3 })
{
_panel.Visible = !_panel.Visible;
}
}
}extends CanvasLayer
## 一个简易的渲染性能监控面板,显示帧率、显存、绘制调用等信息。
## 按 F3 键切换显示/隐藏。
var _panel: RichTextLabel
var _update_timer: float = 0.0
func _ready():
_panel = RichTextLabel.new()
_panel.position = Vector2(10, 10)
_panel.size = Vector2(380, 220)
_panel.bbcode_enabled = true
_panel.modulate = Color(1, 1, 1, 0.85)
var style_box = StyleBoxFlat.new()
style_box.bg_color = Color(0, 0, 0, 0.7)
style_box.set_content_margin_all(8)
_panel.add_theme_stylebox_override("normal", style_box)
add_child(_panel)
func _process(delta: float) -> void:
# 每 0.25 秒更新一次(不需要每帧更新文本)
_update_timer += delta
if _update_timer < 0.25:
return
_update_timer = 0.0
var fps = int(Engine.get_frames_per_second())
var objects = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_OBJECTS_IN_FRAME)
var draw_calls = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME)
var primitives = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_PRIMITIVES_IN_FRAME)
var video_mem = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_VIDEO_MEM_USED)
var texture_mem = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TEXTURE_MEM_USED)
var buffer_mem = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_BUFFER_MEM_USED)
# 格式化显存(转换为 MB)
var video_mem_mb = video_mem / (1024.0 * 1024.0)
var texture_mem_mb = texture_mem / (1024.0 * 1024.0)
var buffer_mem_mb = buffer_mem / (1024.0 * 1024.0)
var fps_color = "green" if fps >= 55 else ("yellow" if fps >= 30 else "red")
_panel.clear()
_panel.append_text("[b]渲染性能监控[/b]\n")
_panel.append_text("[color=%s]FPS: %d[/color]\n" % [fps_color, fps])
_panel.append_text("\n")
_panel.append_text("渲染物体: %d\n" % objects)
_panel.append_text("Draw Calls: %d\n" % draw_calls)
_panel.append_text("图元数量: %s\n" % str(primitives))
_panel.append_text("\n")
_panel.append_text("显存总量: %.1f MB\n" % video_mem_mb)
_panel.append_text("纹理占用: %.1f MB\n" % texture_mem_mb)
_panel.append_text("缓冲占用: %.1f MB\n" % buffer_mem_mb)
func _unhandled_input(ev: InputEvent) -> void:
if ev is InputEventKey and ev.pressed and ev.keycode == KEY_F3:
_panel.visible = not _panel.visible进阶用法:自动性能预警
using Godot;
/// <summary>
/// 自动检测渲染性能问题并发出预警。
/// 当 draw call 过多或显存占用过高时打印警告。
/// </summary>
public partial class PerformanceWatcher : Node
{
[Export] public int ExDrawCallWarningThreshold = 500;
[Export] public int ExDrawCallCriticalThreshold = 1000;
[Export] public int ExObjectWarningThreshold = 2000;
[Export] public double ExVideoMemWarningMB = 1024; // 1 GB
private double _checkInterval = 2.0; // 每 2 秒检查一次
private double _timer = 0;
public override void _Process(double delta)
{
_timer += delta;
if (_timer < _checkInterval) return;
_timer = 0;
var drawCalls = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.TotalDrawCallsInFrame);
var objects = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.TotalObjectsInFrame);
var videoMem = RenderingServer.GetRenderingInfo(RenderingServer.RenderingInfo.VideoMemUsed);
var videoMemMB = videoMem / (1024.0 * 1024.0);
// Draw call 预警
if (drawCalls > ExDrawCallCriticalThreshold)
{
GD.PrintErr($"[严重] Draw Calls 过高: {drawCalls} (阈值: {ExDrawCallCriticalThreshold})");
// 运行结果: [严重] Draw Calls 过高: 1234 (阈值: 1000)
}
else if (drawCalls > ExDrawCallWarningThreshold)
{
GD.Print($"[警告] Draw Calls 偏高: {drawCalls} (阈值: {ExDrawCallWarningThreshold})");
}
// 物体数量预警
if (objects > ExObjectWarningThreshold)
{
GD.Print($"[警告] 渲染物体过多: {objects} (阈值: {ExObjectWarningThreshold})");
}
// 显存预警
if (videoMemMB > ExVideoMemWarningMB)
{
GD.PrintErr($"[严重] 显存占用过高: {videoMemMB:F0} MB (阈值: {ExVideoMemWarningMB} MB)");
}
}
}extends Node
## 自动检测渲染性能问题并发出预警。
## 当 draw call 过多或显存占用过高时打印警告。
@export var draw_call_warning_threshold: int = 500
@export var draw_call_critical_threshold: int = 1000
@export var object_warning_threshold: int = 2000
@export var video_mem_warning_mb: float = 1024.0 # 1 GB
var _check_interval: float = 2.0 # 每 2 秒检查一次
var _timer: float = 0.0
func _process(delta: float) -> void:
_timer += delta
if _timer < _check_interval:
return
_timer = 0.0
var draw_calls = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME)
var objects = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_OBJECTS_IN_FRAME)
var video_mem = RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_VIDEO_MEM_USED)
var video_mem_mb = video_mem / (1024.0 * 1024.0)
# Draw call 预警
if draw_calls > draw_call_critical_threshold:
push_error("[严重] Draw Calls 过高: %d (阈值: %d)" % [draw_calls, draw_call_critical_threshold])
# 运行结果: [严重] Draw Calls 过高: 1234 (阈值: 1000)
elif draw_calls > draw_call_warning_threshold:
push_warning("[警告] Draw Calls 偏高: %d (阈值: %d)" % [draw_calls, draw_call_warning_threshold])
# 物体数量预警
if objects > object_warning_threshold:
push_warning("[警告] 渲染物体过多: %d (阈值: %d)" % [objects, object_warning_threshold])
# 显存预警
if video_mem_mb > video_mem_warning_mb:
push_error("[严重] 显存占用过高: %.0f MB (阈值: %.0f MB)" % [video_mem_mb, video_mem_warning_mb])注意事项
统计信息是上一帧的数据:返回的数值是上一帧(而非当前帧)的渲染统计。这是因为渲染是异步进行的,当前帧的数据可能还没有完全生成。
显存数据以字节为单位:
VideoMemUsed、TextureMemUsed、BufferMemUsed返回的是字节数。要转换为 MB 需要除以1024 * 1024(即1,048,576)。不同渲染器结果可能不同:Godot 支持多种渲染器(Forward+、Mobile、Compatibility),不同渲染器报告的统计信息可能有所差异。特别是 Compatibility 渲染器不支持某些统计类型。
频繁查询不会影响性能:
get_rendering_info只是读取引擎内部的计数器,调用开销极小。但如果你要在 UI 上显示文本,建议每隔 0.2~0.5 秒更新一次显示,避免每帧创建大量字符串。总图元数量可能很大:
TotalPrimitivesInFrame返回的值可能是几万甚至几十万,这在复杂场景中是正常的。关键是要关注 draw call 数量——这是影响性能的主要因素之一。
