diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index 6d6291d00..6671c76c9 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -1679,22 +1679,20 @@ void GLCanvas3D::render()
     if (wxGetApp().plater()->is_render_statistic_dialog_visible()) {
         ImGuiWrapper& imgui = *wxGetApp().imgui();
         imgui.begin(std::string("Render statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
-        imgui.text("Last frame: ");
+        imgui.text("Last frame:");
         ImGui::SameLine();
-        imgui.text(std::to_string(m_render_stats.last_frame));
+        long long average = m_render_stats.get_average();
+        imgui.text(std::to_string(average));
         ImGui::SameLine();
-        imgui.text("  ms");
-        imgui.text("FPS: ");
+        imgui.text("ms");
+        imgui.text("FPS:");
         ImGui::SameLine();
-        imgui.text(std::to_string(static_cast<int>(1000.0f / static_cast<float>(m_render_stats.last_frame))));
-//    imgui.text("Imgui FPS: ");
-//    ImGui::SameLine();
-//    imgui.text(std::to_string(static_cast<int>(ImGui::GetIO().Framerate)));
+        imgui.text(std::to_string((average == 0) ? 0 : static_cast<int>(1000.0f / static_cast<float>(average))));
         ImGui::Separator();
-        imgui.text("Compressed textures: ");
+        imgui.text("Compressed textures:");
         ImGui::SameLine();
         imgui.text(OpenGLManager::are_compressed_textures_supported() ? "supported" : "not supported");
-        imgui.text("Max texture size: ");
+        imgui.text("Max texture size:");
         ImGui::SameLine();
         imgui.text(std::to_string(OpenGLManager::get_gl_info().get_max_tex_size()));
         imgui.end();
@@ -1707,8 +1705,6 @@ void GLCanvas3D::render()
 
     std::string tooltip;
 
-	
-
 	// Negative coordinate means out of the window, likely because the window was deactivated.
 	// In that case the tooltip should be hidden.
     if (m_mouse.position.x() >= 0. && m_mouse.position.y() >= 0.) {
@@ -1745,7 +1741,7 @@ void GLCanvas3D::render()
 
 #if ENABLE_RENDER_STATISTICS
     auto end_time = std::chrono::high_resolution_clock::now();
-    m_render_stats.last_frame = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
+    m_render_stats.add_frame(std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count());
 #endif // ENABLE_RENDER_STATISTICS
 }
 
diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp
index 1329a8744..b8be40401 100644
--- a/src/slic3r/GUI/GLCanvas3D.hpp
+++ b/src/slic3r/GUI/GLCanvas3D.hpp
@@ -320,11 +320,22 @@ class GLCanvas3D
     };
 
 #if ENABLE_RENDER_STATISTICS
-    struct RenderStats
+    class RenderStats
     {
-        long long last_frame;
+        std::queue<std::pair<long long, long long>> m_frames;
+        long long m_curr_total{ 0 };
 
-        RenderStats() : last_frame(0) {}
+    public:
+        void add_frame(long long frame) {
+            long long now = wxGetLocalTimeMillis().GetValue();
+            if (!m_frames.empty() && now - m_frames.front().first > 1000) {
+                m_curr_total -= m_frames.front().second;
+                m_frames.pop();
+            }
+            m_curr_total += frame;
+            m_frames.push({ now, frame });
+        }
+        long long get_average() const { return m_frames.empty() ? 0 : m_curr_total / m_frames.size(); }
     };
 #endif // ENABLE_RENDER_STATISTICS