ImGUI ile FPS ve Frametime çizgi grafiği

Kaptan Yosun

Moderatör
Moderatör
Geliştirici
Yardımsever Üye
Mesaj
1.038
Çözümler
37
Beğeni
1.111
Puan
1.339
Ticaret Puanı
0
:mmt-hakkinda:

ImGUI öğreniyorum ve ilk denemem olarak oyun için FPS ve Frametime takibini kolaylaştırmak için bu fonksiyonu yazdım(Coğunu ChatGPT yazdı tabi :D).

:mmt-resimler:

1732037803728.webp


:mmt-sistem-gereksinimleri:
Clientinizde ImGUI Kütüphane Desteği ekli olmalı:


:mmt-indir:
C++:
Genişlet Daralt Kopyala
// Fonksiyonu ara:
void M2ImguiManager::Render()
   
// Bul:
    ImGui::End();

// Altına ekle:
    /* Render the FPS graph window */
    RenderFpsLineGraph();

Imguimanager.cpp içinde yeni fonksiyonu ekle:
Genişlet Daralt Kopyala
void M2ImguiManager::RenderFpsLineGraph()
{
    static float fpsValue = 0.0f; /* Store the last updated framerate value */
    static std::vector<float> fpsHistory(100, 0.0f); /* Stores the last 100 FPS values */
    static int fpshistoryIndex = 0;

    static float frametimeValue = 0.0f; /* Store the last updated frametime value */
    static std::vector<float> frametimeHistory(100, 0.0f); /* Stores the last 100 FPS values */
    static int frametimehistoryIndex = 0;

    const ImGuiIO& io = ImGui::GetIO();

    /* Using std::chrono to update the fps and frametime slower.
        updates are way too fast without this */
    static auto lastUpdate = std::chrono::steady_clock::now();
    constexpr std::chrono::duration<float> updateInterval{ 1.0f }; /* Update every 1 second */
    auto now = std::chrono::steady_clock::now();

    /* Update FPS and frametime values every 0.5 seconds */
    if (now - lastUpdate >= updateInterval)
    {
        fpsValue = io.Framerate;
        frametimeValue = 1000.0f / io.Framerate;

        /* Update frametime history */
        frametimeHistory[frametimehistoryIndex] = frametimeValue;
        frametimehistoryIndex = (frametimehistoryIndex + 1) % frametimeHistory.size();

        /* Update FPS history */
        fpsHistory[fpshistoryIndex] = fpsValue;
        fpshistoryIndex = (fpshistoryIndex + 1) % fpsHistory.size();

        lastUpdate = now; /* Reset the update timer */
    }

    /* Create a new window for the FPS graph */
    ImGui::Begin("FPS Monitor");

    /* Draw frametime graph */
    ImGui::Text("Frametime: %.1f ms", frametimeValue);
    ImGui::PlotLines(
        "",                            /* Optional label                 */
        frametimeHistory.data(),       /* Data source                    */
        frametimeHistory.size(),       /* Number of data points          */
        frametimehistoryIndex,         /* Offset for the circular buffer */
        nullptr,                       /* Overlay text (optional)        */
        0.0f,                          /* Minimum scale value            */
        *std::max_element(frametimeHistory.begin(), frametimeHistory.end()), /* Dynamic max scale */
        ImVec2(0, 80.0f)               /* Size(width = auto, height = 80 pixels)                  */
    );


    /* Draw FPS graph */
    ImGui::Text("FPS: %.1f", fpsValue);
    ImGui::PlotLines(
        "",                      /* Optional label                 */
        fpsHistory.data(),       /* Data source                    */
        fpsHistory.size(),       /* Number of data points          */
        fpshistoryIndex,         /* Offset for the circular buffer */
        nullptr,                 /* Overlay text (optional)        */
        0.0f,                    /* Minimum scale value            */
        *std::max_element(fpsHistory.begin(), fpsHistory.end()), /* Dynamic max scale */
        ImVec2(0, 80.0f)         /* Size(width = auto, height = 80 pixels)            */
    );

    ImGui::End();
}

Imguimanager.h:
Genişlet Daralt Kopyala
// Ara:
void Render();

// Altına ekle:
void RenderFpsLineGraph();
 
Son düzenleme:
Geri
Üst