diff --git a/src/gui/debugWindow.cpp b/src/gui/debugWindow.cpp index ae1a1dfce..7eb3906aa 100644 --- a/src/gui/debugWindow.cpp +++ b/src/gui/debugWindow.cpp @@ -540,9 +540,23 @@ void FurnaceGUI::drawDebug() { } if (ImGui::TreeNode("Performance")) { double perfFreq=SDL_GetPerformanceFrequency()/1000000.0; + int lastProcTime=(int)e->processTime/1000; + TAAudioDesc& audioGot=e->getAudioDescGot(); + + ImGui::Text("video frame: %.0fµs",ImGui::GetIO().DeltaTime*1000000.0); + ImGui::Text("audio frame: %.0fµs",1000000.0*(double)audioGot.bufsize/(double)audioGot.rate); + ImGui::Separator(); + + ImGui::Text("audio: %dµs",lastProcTime); ImGui::Text("render: %.0fµs",(double)renderTimeDelta/perfFreq); ImGui::Text("layout: %.0fµs",(double)layoutTimeDelta/perfFreq); ImGui::Text("event: %.0fµs",(double)eventTimeDelta/perfFreq); + ImGui::Separator(); + + ImGui::Text("details:"); + for (int i=0; igetTotalTicks(); int totalSeconds=e->getTotalSeconds(); @@ -4269,36 +4331,38 @@ bool FurnaceGUI::loop() { if (e->isPlaying()) monitorPos+=ImGui::GetIO().DeltaTime; } - drawSampleList(); - drawSampleEdit(); - drawWaveList(); - drawWaveEdit(); - drawInsList(); - drawInsEdit(); - drawMixer(); + MEASURE(sampleList,drawSampleList()); + MEASURE(sampleEdit,drawSampleEdit()); + MEASURE(waveList,drawWaveList()); + MEASURE(waveEdit,drawWaveEdit()); + MEASURE(insList,drawInsList()); + MEASURE(insEdit,drawInsEdit()); + MEASURE(mixer,drawMixer()); - readOsc(); + MEASURE(readOsc,readOsc()); - drawOsc(); - drawChanOsc(); - drawVolMeter(); - drawSettings(); - drawDebug(); - drawStats(); - if (!basicMode) drawCompatFlags(); - drawPiano(); - drawNotes(); + MEASURE(osc,drawOsc()); + MEASURE(chanOsc,drawChanOsc()); + MEASURE(volMeter,drawVolMeter()); + MEASURE(settings,drawSettings()); + MEASURE(debug,drawDebug()); + MEASURE(stats,drawStats()); if (!basicMode) { - drawChannels(); + MEASURE(compatFlags,drawCompatFlags()); } - drawPatManager(); + MEASURE(piano,drawPiano()); + MEASURE(notes,drawNotes()); if (!basicMode) { - drawSysManager(); + MEASURE(channels,drawChannels()); } - drawClock(); - drawRegView(); - drawLog(); - drawEffectList(); + MEASURE(patManager,drawPatManager()); + if (!basicMode) { + MEASURE(sysManager,drawSysManager()); + } + MEASURE(clock,drawClock()); + MEASURE(regView,drawRegView()); + MEASURE(log,drawLog()); + MEASURE(effectList,drawEffectList()); } activateTutorial(GUI_TUTORIAL_OVERVIEW); @@ -4960,6 +5024,8 @@ bool FurnaceGUI::loop() { } if (aboutOpen) drawAbout(); + MEASURE_BEGIN(popup); + if (ImGui::BeginPopupModal("Rendering...",NULL,ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("Please wait..."); if (ImGui::Button("Abort")) { @@ -5491,12 +5557,16 @@ bool FurnaceGUI::loop() { ImGui::EndPopup(); } + MEASURE_END(popup); + if (!tutorial.introPlayed || settings.alwaysPlayIntro!=0) { + MEASURE_BEGIN(intro); initialScreenWipe=0; if (settings.alwaysPlayIntro==1) { shortIntro=true; } drawIntro(introPos); + MEASURE_END(intro); } else { introPos=12.0; } @@ -6577,6 +6647,7 @@ FurnaceGUI::FurnaceGUI(): eventTimeBegin(0), eventTimeEnd(0), eventTimeDelta(0), + perfMetricsLen(0), chanToMove(-1), sysToMove(-1), sysToDelete(-1), diff --git a/src/gui/gui.h b/src/gui/gui.h index 670fadea6..fe44ea263 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1153,6 +1153,17 @@ struct FurnaceGUIImage { ch(0) {} }; +struct FurnaceGUIPerfMetric { + const char* name; + int elapsed; + FurnaceGUIPerfMetric(const char* n, int t): + name(n), + elapsed(t) {} + FurnaceGUIPerfMetric(): + name(NULL), + elapsed(0) {} +}; + class FurnaceGUI { DivEngine* e; @@ -1738,6 +1749,12 @@ class FurnaceGUI { int renderTimeBegin, renderTimeEnd, renderTimeDelta; int eventTimeBegin, eventTimeEnd, eventTimeDelta; + FurnaceGUIPerfMetric perfMetrics[64]; + int perfMetricsLen; + + FurnaceGUIPerfMetric perfMetricsLast[64]; + int perfMetricsLastLen; + std::map images; int chanToMove, sysToMove, sysToDelete, opToMove;