diff --git a/examples/common/example-glue.cpp b/examples/common/example-glue.cpp index b6b3d4562..0edad442b 100644 --- a/examples/common/example-glue.cpp +++ b/examples/common/example-glue.cpp @@ -9,6 +9,56 @@ #include #include #include +#include + +#define SAMPLE_COUNT 100 + +struct SampleData +{ + void pushSample(float value) + { + values[offset] = value; + offset = (offset+1) % SAMPLE_COUNT; + + } + + float getMin() const + { + float minValue = FLT_MAX; + for(size_t i = 0; i < SAMPLE_COUNT; ++i) + { + minValue = bx::min(minValue, values[i]); + } + return minValue; + } + + float getMax() const + { + float maxValue = -FLT_MAX; + for(size_t i = 0; i < SAMPLE_COUNT; ++i) + { + maxValue = bx::max(maxValue, values[i]); + } + return maxValue; + } + + float getAvg() const + { + float avgValue = 0; + for(size_t i = 0; i < SAMPLE_COUNT; ++i) + { + avgValue += values[i]; + } + return avgValue / SAMPLE_COUNT; + } + + + int offset = 0; + float values[SAMPLE_COUNT] = {0}; + +}; + +static SampleData s_frameTime; static bool bar(float _width, float _maxWidth, float _height, const ImVec4& _color) { @@ -80,7 +130,7 @@ void showExampleDialog(entry::AppI* _app, const char* _errorText) , ImGuiCond_FirstUseEver ); ImGui::SetNextWindowSize( - ImVec2(300.0f, 200.0f) + ImVec2(300.0f, 220.0f) , ImGuiCond_FirstUseEver ); @@ -229,10 +279,25 @@ void showExampleDialog(entry::AppI* _app, const char* _errorText) const double toMsCpu = 1000.0/stats->cpuTimerFreq; const double toMsGpu = 1000.0/stats->gpuTimerFreq; const double frameMs = double(stats->cpuTimeFrame)*toMsCpu; - ImGui::Text("Frame %0.3f [ms], %0.3f FPS" - , frameMs - , 1000.0/frameMs - ); + + s_frameTime.pushSample(float(frameMs)); + + const float frameMsAvg = s_frameTime.getAvg(); + + std::string frameTextOverlay; + bx::stringPrintf(frameTextOverlay, "%s%.3fms, %s%.3fms\nAvg: %.3fms, %.1f FPS" + , ICON_FA_ARROW_UP, s_frameTime.getMax() + , ICON_FA_ARROW_DOWN, s_frameTime.getMin() + , frameMsAvg, 1000.0/frameMsAvg + ); + + ImGui::PushStyleColor(ImGuiCol_PlotHistogram, ImColor(0.0f,0.5f,0.15f,1.0f).Value); + ImGui::PlotHistogram("Frame", s_frameTime.values + , SAMPLE_COUNT, s_frameTime.offset + , frameTextOverlay.c_str() + , 0.0f, 60.0f, ImVec2(0, 45) + ); + ImGui::PopStyleColor(); ImGui::Text("Submit CPU %0.3f, GPU %0.3f (L: %d)" , double(stats->cpuTimeEnd - stats->cpuTimeBegin)*toMsCpu