Merge pull request #110 from teamfisk/PerformanceTiming

Performance timing
This commit is contained in:
2016-02-18 10:33:24 +01:00
11 changed files with 156 additions and 9 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ project(TacticalZ-Engine)
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(GLFW REQUIRED)
find_package(Boost REQUIRED COMPONENTS system filesystem thread chrono program_options)
find_package(Boost REQUIRED COMPONENTS system filesystem thread chrono timer program_options)
find_package(assimp REQUIRED)
find_package(ZLIB REQUIRED)
find_package(PNG REQUIRED)
+76
View File
@@ -0,0 +1,76 @@
#include "Core/PerformanceTimer.h"
#include <ctime>
#include <fstream>
cpu_timer PerformanceTimer::m_Timer;
std::map<std::string, cpu_timer> PerformanceTimer::timers;
std::string PerformanceTimer::currentTimerRunning = "";
void PerformanceTimer::StartTimer(std::string nameOfTimer)
{
timers[nameOfTimer].stop();
timers[nameOfTimer].start();
currentTimerRunning = nameOfTimer;
}
void PerformanceTimer::StartTimerAndStopPrevious(std::string nameOfTimer)
{
//stop the current timer and start some other - useful to not have to stop timers all the time
if (currentTimerRunning != "") {
timers[currentTimerRunning].stop();
}
timers[nameOfTimer].stop();
timers[nameOfTimer].start();
currentTimerRunning = nameOfTimer;
}
void PerformanceTimer::StopTimer(std::string nameOfTimer)
{
timers[nameOfTimer].stop();
currentTimerRunning = nameOfTimer;
}
void PerformanceTimer::SetFrameNumber(int frameNumber)
{
}
void PerformanceTimer::ResetAllTimers()
{
//stop all timers
for (auto aTimer : timers)
{
aTimer.second.stop();
}
currentTimerRunning = "";
timers.clear();
}
void PerformanceTimer::CreateExcelData()
{
//get time
std::time_t t = std::time(NULL);
char tStr[16];
std::strftime(tStr, 32, " %a %H-%M-%S", std::localtime(&t));
std::string time(tStr);
std::string path("TacticalZ");
path += time + ".csv";
std::ofstream someFileStream;
someFileStream.open(path, std::ofstream::out);
someFileStream << "classname" << ',' << "walltime" << ',' << "userTime" << ',' << "systemTime" << '\n';
//write all timers to file
for (auto aTimer : timers)
{
//remove the "class" name in front of the string
auto className = aTimer.first;
if (className.find("class ") != std::string::npos) {
className.replace(0, 6, "");
}
auto wallTime = (double)aTimer.second.elapsed().wall*1e-3;
auto userTime = (double)aTimer.second.elapsed().user*1e-3;
auto systemTime = (double)aTimer.second.elapsed().system*1e-3;
someFileStream << className << "," << wallTime << ',' << userTime << ',' << systemTime << '\n';
}
someFileStream.close();
}
+6
View File
@@ -225,6 +225,12 @@ bool EditorSystem::OnInputCommand(const Events::InputCommand& e)
Enable();
}
}
if (e.Command == "PerformanceTimingResetAllTimers" && e.Value > 0) {
PerformanceTimer::ResetAllTimers();
}
if (e.Command == "PerformanceTimingCreateExcelData" && e.Value > 0) {
PerformanceTimer::CreateExcelData();
}
return true;
}
+18 -1
View File
@@ -99,34 +99,48 @@ void Renderer::Draw(RenderFrame& frame)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Clear other buffers
PerformanceTimer::StartTimer("Renderer-ClearBuffers");
m_PickingPass->ClearPicking();
m_DrawFinalPass->ClearBuffer();
m_DrawBloomPass->ClearBuffer();
PerformanceTimer::StopTimer("Renderer-ClearBuffers");
for (auto scene : frame.RenderScenes){
PerformanceTimer::StartTimer("Renderer-Depth");
SortRenderJobsByDepth(*scene);
GLERROR("SortByDepth");
PerformanceTimer::StartTimerAndStopPrevious("Renderer-Drawing PickingPass");
m_PickingPass->Draw(*scene);
GLERROR("Drawing pickingpass");
PerformanceTimer::StartTimerAndStopPrevious("Renderer-Generate Frustrums");
m_LightCullingPass->GenerateNewFrustum(*scene);
GLERROR("Generate frustums");
PerformanceTimer::StartTimerAndStopPrevious("Renderer-Filling Light List");
m_LightCullingPass->FillLightList(*scene);
GLERROR("Filling light list");
PerformanceTimer::StartTimerAndStopPrevious("Renderer-Light Culling");
m_LightCullingPass->CullLights(*scene);
GLERROR("LightCulling");
PerformanceTimer::StartTimerAndStopPrevious("Renderer-Draw Geometry+Light");
m_DrawFinalPass->Draw(*scene);
GLERROR("Draw Geometry+Light");
//m_DrawScenePass->Draw(*scene);
PerformanceTimer::StartTimerAndStopPrevious("Renderer-Draw Text");
m_TextPass->Draw(*scene, *m_DrawFinalPass->FinalPassFrameBuffer());
GLERROR("Draw Text");
PerformanceTimer::StopTimer("Renderer-Draw Text");
}
PerformanceTimer::StartTimer("Renderer-Draw Bloom");
m_DrawBloomPass->Draw(m_DrawFinalPass->BloomTexture());
PerformanceTimer::StopTimer("Renderer-Draw Bloom");
if (m_DebugTextureToDraw == 0) {
PerformanceTimer::StartTimer("Renderer-Color Correction Pass");
m_DrawColorCorrectionPass->Draw(m_DrawFinalPass->SceneTexture(), m_DrawBloomPass->GaussianTexture(), m_DrawFinalPass->SceneTextureLowRes(), m_DrawFinalPass->BloomTextureLowRes(), frame.Gamma, frame.Exposure);
PerformanceTimer::StopTimer("Renderer-Color Correction Pass");
}
PerformanceTimer::StartTimer("Renderer-Misc Debug Draws");
if (m_DebugTextureToDraw == 1) {
m_DrawScreenQuadPass->Draw(m_DrawFinalPass->SceneTexture());
}
@@ -145,10 +159,13 @@ void Renderer::Draw(RenderFrame& frame)
if (m_DebugTextureToDraw == 6) {
m_DrawScreenQuadPass->Draw(m_PickingPass->PickingTexture());
}
PerformanceTimer::StopTimer("Renderer-Misc Debug Draws");
PerformanceTimer::StartTimer("Renderer-ImGuiRenderPass");
m_ImGuiRenderPass->Draw();
GLERROR("Imgui draw");
glfwSwapBuffers(m_Window);
PerformanceTimer::StopTimer("Renderer-ImGuiRenderPass");
}
PickData Renderer::Pick(glm::vec2 screenCoord)