|
@@ -2482,7 +2482,9 @@ void Node3DEditorViewport::_notification(int p_what) {
|
|
|
viewport->set_msaa(Viewport::MSAA(msaa_mode));
|
|
|
|
|
|
bool show_info = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION));
|
|
|
- info_label->set_visible(show_info);
|
|
|
+ if (show_info != info_label->is_visible()) {
|
|
|
+ info_label->set_visible(show_info);
|
|
|
+ }
|
|
|
|
|
|
Camera3D *current_camera;
|
|
|
|
|
@@ -2509,17 +2511,46 @@ void Node3DEditorViewport::_notification(int p_what) {
|
|
|
text += TTR("Surface Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_SURFACE_CHANGES_IN_FRAME)) + "\n";
|
|
|
text += TTR("Draw Calls") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_DRAW_CALLS_IN_FRAME)) + "\n";
|
|
|
text += TTR("Vertices") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_VERTICES_IN_FRAME));
|
|
|
+
|
|
|
info_label->set_text(text);
|
|
|
}
|
|
|
|
|
|
// FPS Counter.
|
|
|
- bool show_fps = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FPS));
|
|
|
- fps_label->set_visible(show_fps);
|
|
|
-
|
|
|
+ bool show_fps = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME));
|
|
|
+
|
|
|
+ if (show_fps != fps_label->is_visible()) {
|
|
|
+ fps_label->set_visible(show_fps);
|
|
|
+ RS::get_singleton()->viewport_set_measure_render_time(viewport->get_viewport_rid(), show_fps);
|
|
|
+ for (int i = 0; i < FRAME_TIME_HISTORY; i++) {
|
|
|
+ cpu_time_history[i] = 0;
|
|
|
+ gpu_time_history[i] = 0;
|
|
|
+ }
|
|
|
+ cpu_time_history_index = 0;
|
|
|
+ cpu_time_history_index = 0;
|
|
|
+ }
|
|
|
if (show_fps) {
|
|
|
+
|
|
|
+ cpu_time_history[cpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_cpu(viewport->get_viewport_rid());
|
|
|
+ cpu_time_history_index = (cpu_time_history_index + 1) % FRAME_TIME_HISTORY;
|
|
|
+ float cpu_time = 0.0;
|
|
|
+ for (int i = 0; i < FRAME_TIME_HISTORY; i++) {
|
|
|
+ cpu_time += cpu_time_history[i];
|
|
|
+ }
|
|
|
+ cpu_time /= FRAME_TIME_HISTORY;
|
|
|
+
|
|
|
+ gpu_time_history[gpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_gpu(viewport->get_viewport_rid());
|
|
|
+ gpu_time_history_index = (gpu_time_history_index + 1) % FRAME_TIME_HISTORY;
|
|
|
+ float gpu_time = 0.0;
|
|
|
+ for (int i = 0; i < FRAME_TIME_HISTORY; i++) {
|
|
|
+ gpu_time += gpu_time_history[i];
|
|
|
+ }
|
|
|
+ gpu_time /= FRAME_TIME_HISTORY;
|
|
|
+
|
|
|
String text;
|
|
|
- const float temp_fps = Engine::get_singleton()->get_frames_per_second();
|
|
|
- text += TTR(vformat("FPS: %d (%s ms)", temp_fps, String::num(1000.0f / temp_fps, 2)));
|
|
|
+ text += TTR("CPU Time") + ": " + String::num(cpu_time, 1) + " ms\n";
|
|
|
+ text += TTR("GPU Time") + ": " + String::num(gpu_time, 1) + " ms\n";
|
|
|
+ text += TTR("FPS") + ": " + itos(1000.0 / gpu_time);
|
|
|
+
|
|
|
fps_label->set_text(text);
|
|
|
}
|
|
|
|
|
@@ -2980,9 +3011,9 @@ void Node3DEditorViewport::_menu_option(int p_option) {
|
|
|
view_menu->get_popup()->set_item_checked(idx, !current);
|
|
|
|
|
|
} break;
|
|
|
- case VIEW_FPS: {
|
|
|
+ case VIEW_FRAME_TIME: {
|
|
|
|
|
|
- int idx = view_menu->get_popup()->get_item_index(VIEW_FPS);
|
|
|
+ int idx = view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME);
|
|
|
bool current = view_menu->get_popup()->is_item_checked(idx);
|
|
|
view_menu->get_popup()->set_item_checked(idx, !current);
|
|
|
|
|
@@ -3338,12 +3369,12 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) {
|
|
|
if (view_menu->get_popup()->is_item_checked(idx) != information)
|
|
|
_menu_option(VIEW_INFORMATION);
|
|
|
}
|
|
|
- if (p_state.has("fps")) {
|
|
|
- bool fps = p_state["fps"];
|
|
|
+ if (p_state.has("frame_time")) {
|
|
|
+ bool fps = p_state["frame_time"];
|
|
|
|
|
|
- int idx = view_menu->get_popup()->get_item_index(VIEW_FPS);
|
|
|
+ int idx = view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME);
|
|
|
if (view_menu->get_popup()->is_item_checked(idx) != fps)
|
|
|
- _menu_option(VIEW_FPS);
|
|
|
+ _menu_option(VIEW_FRAME_TIME);
|
|
|
}
|
|
|
if (p_state.has("half_res")) {
|
|
|
bool half_res = p_state["half_res"];
|
|
@@ -3400,7 +3431,7 @@ Dictionary Node3DEditorViewport::get_state() const {
|
|
|
d["doppler"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUDIO_DOPPLER));
|
|
|
d["gizmos"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_GIZMOS));
|
|
|
d["information"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION));
|
|
|
- d["fps"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FPS));
|
|
|
+ d["frame_time"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME));
|
|
|
d["half_res"] = subviewport_container->get_stretch_shrink() > 1;
|
|
|
d["cinematic_preview"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW));
|
|
|
if (previewing)
|
|
@@ -3812,6 +3843,9 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_
|
|
|
|
|
|
Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, EditorNode *p_editor, int p_index) {
|
|
|
|
|
|
+ cpu_time_history_index = 0;
|
|
|
+ cpu_time_history_index = 0;
|
|
|
+
|
|
|
_edit.mode = TRANSFORM_NONE;
|
|
|
_edit.plane = TRANSFORM_VIEW;
|
|
|
_edit.edited_gizmo = 0;
|
|
@@ -3912,7 +3946,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito
|
|
|
view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_environment", TTR("View Environment")), VIEW_ENVIRONMENT);
|
|
|
view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_gizmos", TTR("View Gizmos")), VIEW_GIZMOS);
|
|
|
view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_information", TTR("View Information")), VIEW_INFORMATION);
|
|
|
- view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_fps", TTR("View FPS")), VIEW_FPS);
|
|
|
+ view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_fps", TTR("View Frame Time")), VIEW_FRAME_TIME);
|
|
|
view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT), true);
|
|
|
view_menu->get_popup()->add_separator();
|
|
|
view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_half_resolution", TTR("Half Resolution")), VIEW_HALF_RESOLUTION);
|
|
@@ -3989,7 +4023,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito
|
|
|
fps_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 10 * EDSCALE);
|
|
|
fps_label->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -10 * EDSCALE);
|
|
|
fps_label->set_h_grow_direction(GROW_DIRECTION_BEGIN);
|
|
|
- fps_label->set_tooltip(TTR("Note: The FPS value displayed is the editor's framerate.\nIt cannot be used as a reliable indication of in-game performance."));
|
|
|
+ fps_label->set_tooltip(TTR("Note: The FPS is estimated on a 60hz refresh rate."));
|
|
|
fps_label->set_mouse_filter(MOUSE_FILTER_PASS); // Otherwise tooltip doesn't show.
|
|
|
surface->add_child(fps_label);
|
|
|
fps_label->hide();
|