Performance counters

dev-ui
Piotr Dziwinski 2012-10-25 23:29:49 +02:00
parent 3845efbbff
commit 3ce488307f
3 changed files with 247 additions and 14 deletions

View File

@ -122,6 +122,12 @@ CApplication::CApplication()
m_curTimeStamp = CreateTimeStamp(); m_curTimeStamp = CreateTimeStamp();
m_lastTimeStamp = CreateTimeStamp(); m_lastTimeStamp = CreateTimeStamp();
for (int i = 0; i < PCNT_MAX; ++i)
{
m_performanceCounters[i][0] = CreateTimeStamp();
m_performanceCounters[i][1] = CreateTimeStamp();
}
m_joystickEnabled = false; m_joystickEnabled = false;
m_mouseMode = MOUSE_SYSTEM; m_mouseMode = MOUSE_SYSTEM;
@ -171,6 +177,12 @@ CApplication::~CApplication()
DestroyTimeStamp(m_baseTimeStamp); DestroyTimeStamp(m_baseTimeStamp);
DestroyTimeStamp(m_curTimeStamp); DestroyTimeStamp(m_curTimeStamp);
DestroyTimeStamp(m_lastTimeStamp); DestroyTimeStamp(m_lastTimeStamp);
for (int i = 0; i < PCNT_MAX; ++i)
{
DestroyTimeStamp(m_performanceCounters[i][0]);
DestroyTimeStamp(m_performanceCounters[i][1]);
}
} }
ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[]) ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
@ -718,6 +730,14 @@ int CApplication::Run()
while (true) while (true)
{ {
ResetPerformanceCounters();
if (m_active)
{
StartPerformanceCounter(PCNT_ALL);
StartPerformanceCounter(PCNT_EVENT_PROCESSING);
}
// To be sure no old event remains // To be sure no old event remains
m_private->currentEvent.type = SDL_NOEVENT; m_private->currentEvent.type = SDL_NOEVENT;
@ -829,21 +849,38 @@ int CApplication::Run()
m_robotMain->EventProcess(event); m_robotMain->EventProcess(event);
} }
StopPerformanceCounter(PCNT_EVENT_PROCESSING);
StartPerformanceCounter(PCNT_UPDATE_ALL);
// Prepare and process step simulation event // Prepare and process step simulation event
event = CreateUpdateEvent(); event = CreateUpdateEvent();
if (event.type != EVENT_NULL && m_robotMain != nullptr) if (event.type != EVENT_NULL && m_robotMain != nullptr)
{ {
StartPerformanceCounter(PCNT_UPDATE_ENGINE);
m_engine->FrameUpdate(); m_engine->FrameUpdate();
StopPerformanceCounter(PCNT_UPDATE_ENGINE);
m_sound->FrameMove(m_relTime); m_sound->FrameMove(m_relTime);
StartPerformanceCounter(PCNT_UPDATE_GAME);
m_robotMain->EventProcess(event); m_robotMain->EventProcess(event);
StopPerformanceCounter(PCNT_UPDATE_GAME);
} }
StopPerformanceCounter(PCNT_UPDATE_ALL);
/* Update mouse position explicitly right before rendering /* Update mouse position explicitly right before rendering
* because mouse events are usually way behind */ * because mouse events are usually way behind */
UpdateMouse(); UpdateMouse();
StartPerformanceCounter(PCNT_RENDER_ALL);
Render(); Render();
StopPerformanceCounter(PCNT_RENDER_ALL);
StopPerformanceCounter(PCNT_ALL);
UpdatePerformanceCountersData();
if (m_lowCPU) if (m_lowCPU)
{ {
@ -1451,3 +1488,43 @@ bool CApplication::GetLowCPU()
{ {
return m_lowCPU; return m_lowCPU;
} }
void CApplication::StartPerformanceCounter(PerformanceCounter counter)
{
GetCurrentTimeStamp(m_performanceCounters[counter][0]);
}
void CApplication::StopPerformanceCounter(PerformanceCounter counter)
{
GetCurrentTimeStamp(m_performanceCounters[counter][1]);
}
float CApplication::GetPerformanceCounterData(PerformanceCounter counter)
{
return m_performanceCountersData[counter];
}
void CApplication::ResetPerformanceCounters()
{
for (int i = 0; i < PCNT_MAX; ++i)
{
StartPerformanceCounter(static_cast<PerformanceCounter>(i));
StopPerformanceCounter(static_cast<PerformanceCounter>(i));
}
}
void CApplication::UpdatePerformanceCountersData()
{
long long sum = TimeStampExactDiff(m_performanceCounters[PCNT_ALL][0],
m_performanceCounters[PCNT_ALL][1]);
for (int i = 0; i < PCNT_MAX; ++i)
{
long long diff = TimeStampExactDiff(m_performanceCounters[i][0],
m_performanceCounters[i][1]);
m_performanceCountersData[static_cast<PerformanceCounter>(i)] =
static_cast<float>(diff) / static_cast<float>(sum);
}
}

View File

@ -113,6 +113,31 @@ enum MouseMode
MOUSE_NONE, //! < no cursor visible MOUSE_NONE, //! < no cursor visible
}; };
/**
* \enum PerformanceCounter
* \brief Type of counter testing performance
*/
enum PerformanceCounter
{
PCNT_EVENT_PROCESSING, //! < event processing (except update events)
PCNT_UPDATE_ALL, //! < the whole frame update process
PCNT_UPDATE_ENGINE, //! < frame update in CEngine
PCNT_UPDATE_PARTICLE, //! < frame update in CParticle
PCNT_UPDATE_GAME, //! < frame update in CRobotMain
PCNT_RENDER_ALL, //! < the whole rendering process
PCNT_RENDER_PARTICLE, //! < rendering the particles in 3D
PCNT_RENDER_WATER, //! < rendering the water
PCNT_RENDER_TERRAIN, //! < rendering the terrain
PCNT_RENDER_OBJECTS, //! < rendering the 3D objects
PCNT_RENDER_INTERFACE, //! < rendering 2D interface
PCNT_ALL, //! < all counters together
PCNT_MAX
};
struct ApplicationPrivate; struct ApplicationPrivate;
/** /**
@ -301,6 +326,13 @@ public:
bool GetLowCPU(); bool GetLowCPU();
//@} //@}
//! Management of performance counters
//@{
void StartPerformanceCounter(PerformanceCounter counter);
void StopPerformanceCounter(PerformanceCounter counter);
float GetPerformanceCounterData(PerformanceCounter counter);
//@}
protected: protected:
//! Creates the window's SDL_Surface //! Creates the window's SDL_Surface
bool CreateVideoSurface(); bool CreateVideoSurface();
@ -321,6 +353,11 @@ protected:
//! Closes the joystick device //! Closes the joystick device
void CloseJoystick(); void CloseJoystick();
//! Resets all performance counters to zero
void ResetPerformanceCounters();
//! Updates performance counters from gathered timer data
void UpdatePerformanceCountersData();
protected: protected:
//! Instance manager //! Instance manager
CInstanceManager* m_iMan; CInstanceManager* m_iMan;
@ -363,6 +400,9 @@ protected:
SystemTimeStamp* m_lastTimeStamp; SystemTimeStamp* m_lastTimeStamp;
SystemTimeStamp* m_curTimeStamp; SystemTimeStamp* m_curTimeStamp;
SystemTimeStamp* m_performanceCounters[PCNT_MAX][2];
float m_performanceCountersData[PCNT_MAX];
long long m_realAbsTimeBase; long long m_realAbsTimeBase;
long long m_realAbsTime; long long m_realAbsTime;
long long m_realRelTime; long long m_realRelTime;

View File

@ -378,7 +378,11 @@ void CEngine::FrameUpdate()
float rTime = m_app->GetRelTime(); float rTime = m_app->GetRelTime();
m_lightMan->UpdateProgression(rTime); m_lightMan->UpdateProgression(rTime);
m_app->StartPerformanceCounter(PCNT_UPDATE_PARTICLE);
m_particle->FrameParticle(rTime); m_particle->FrameParticle(rTime);
m_app->StopPerformanceCounter(PCNT_UPDATE_PARTICLE);
ComputeDistance(); ComputeDistance();
UpdateGeometry(); UpdateGeometry();
@ -409,7 +413,7 @@ void CEngine::FrameUpdate()
{ {
m_groundMark.intensity = 0.0f; m_groundMark.intensity = 0.0f;
m_groundMark.phase = ENG_GR_MARK_PHASE_NULL; m_groundMark.phase = ENG_GR_MARK_PHASE_NULL;
m_groundMark.draw = false; m_groundMark.draw = false;
} }
} }
} }
@ -3020,7 +3024,9 @@ void CEngine::Render()
if (m_drawWorld) if (m_drawWorld)
Draw3DScene(); Draw3DScene();
m_app->StartPerformanceCounter(PCNT_RENDER_INTERFACE);
DrawInterface(); DrawInterface();
m_app->StopPerformanceCounter(PCNT_RENDER_INTERFACE);
// End the scene // End the scene
m_device->EndScene(); m_device->EndScene();
@ -3051,12 +3057,13 @@ void CEngine::Draw3DScene()
if (m_waterMode) m_water->DrawBack(); // draws water background if (m_waterMode) m_water->DrawBack(); // draws water background
m_app->StartPerformanceCounter(PCNT_RENDER_TERRAIN);
// Draw terrain with shadows, if shadows enabled
if (m_shadowVisible) if (m_shadowVisible)
{ {
m_lightMan->UpdateDeviceLights(ENG_OBJTYPE_TERRAIN); m_lightMan->UpdateDeviceLights(ENG_OBJTYPE_TERRAIN);
// Draw the terrain
for (int l1 = 0; l1 < static_cast<int>( m_objectTree.size() ); l1++) for (int l1 = 0; l1 < static_cast<int>( m_objectTree.size() ); l1++)
{ {
EngineObjLevel1& p1 = m_objectTree[l1]; EngineObjLevel1& p1 = m_objectTree[l1];
@ -3122,7 +3129,11 @@ void CEngine::Draw3DScene()
DrawShadow(); DrawShadow();
} }
// Draw objects (non-terrain) m_app->StopPerformanceCounter(PCNT_RENDER_TERRAIN);
// Draw other objects (and if shadows disabled, also terrain)
m_app->StartPerformanceCounter(PCNT_RENDER_OBJECTS);
bool transparent = false; bool transparent = false;
@ -3274,11 +3285,21 @@ void CEngine::Draw3DScene()
} }
} }
m_app->StopPerformanceCounter(PCNT_RENDER_OBJECTS);
m_lightMan->UpdateDeviceLights(ENG_OBJTYPE_TERRAIN); m_lightMan->UpdateDeviceLights(ENG_OBJTYPE_TERRAIN);
if (m_waterMode) m_water->DrawSurf(); // draws water surface if (m_waterMode)
{
m_app->StartPerformanceCounter(PCNT_RENDER_WATER);
m_water->DrawSurf(); // draws water surface
m_app->StopPerformanceCounter(PCNT_RENDER_WATER);
}
m_app->StartPerformanceCounter(PCNT_RENDER_PARTICLE);
m_particle->DrawParticle(SH_WORLD); // draws the particles of the 3D world m_particle->DrawParticle(SH_WORLD); // draws the particles of the 3D world
m_app->StopPerformanceCounter(PCNT_RENDER_PARTICLE);
m_lightning->Draw(); // draws lightning m_lightning->Draw(); // draws lightning
if (m_lensMode) DrawForegroundImage(); // draws the foreground if (m_lensMode) DrawForegroundImage(); // draws the foreground
@ -4220,15 +4241,10 @@ void CEngine::DrawStats()
if (!m_showStats) if (!m_showStats)
return; return;
std::stringstream str;
str << "Triangles: ";
str << m_statisticTriangle;
std::string triangleText = str.str();
float height = m_text->GetAscent(FONT_COLOBOT, 12.0f); float height = m_text->GetAscent(FONT_COLOBOT, 12.0f);
float width = 0.2f; float width = 0.2f;
Math::Point pos(0.04f, 0.04f + height); Math::Point pos(0.04f, 0.04f + 17 * height);
SetState(ENG_RSTATE_OPAQUE_COLOR); SetState(ENG_RSTATE_OPAQUE_COLOR);
@ -4236,9 +4252,9 @@ void CEngine::DrawStats()
VertexCol vertex[4] = VertexCol vertex[4] =
{ {
VertexCol(Math::Vector(pos.x , pos.y - height, 0.0f), black), VertexCol(Math::Vector(pos.x , pos.y - 17 * height, 0.0f), black),
VertexCol(Math::Vector(pos.x , pos.y + height, 0.0f), black), VertexCol(Math::Vector(pos.x , pos.y + height, 0.0f), black),
VertexCol(Math::Vector(pos.x + width, pos.y - height, 0.0f), black), VertexCol(Math::Vector(pos.x + width, pos.y - 17 * height, 0.0f), black),
VertexCol(Math::Vector(pos.x + width, pos.y + height, 0.0f), black) VertexCol(Math::Vector(pos.x + width, pos.y + height, 0.0f), black)
}; };
@ -4246,7 +4262,107 @@ void CEngine::DrawStats()
SetState(ENG_RSTATE_TEXT); SetState(ENG_RSTATE_TEXT);
m_text->DrawText(triangleText, FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f)); std::stringstream str;
str.str("");
str << "Event processing: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_EVENT_PROCESSING);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
pos.y -= height;
str.str("");
str << "Frame update: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_UPDATE_ALL);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
str.str("");
str << "Engine update: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_UPDATE_ENGINE);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
str.str("");
str << "Particle update: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_UPDATE_PARTICLE);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
str.str("");
str << "Game update: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_UPDATE_GAME);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
float otherUpdate = Math::Max(0.0f, m_app->GetPerformanceCounterData(PCNT_UPDATE_ALL) -
m_app->GetPerformanceCounterData(PCNT_UPDATE_ENGINE) -
m_app->GetPerformanceCounterData(PCNT_UPDATE_PARTICLE) -
m_app->GetPerformanceCounterData(PCNT_UPDATE_GAME));
str.str("");
str << "Other update: " << std::fixed << std::setprecision(2) << otherUpdate;
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
pos.y -= height;
str.str("");
str << "Frame render: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_RENDER_ALL);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
str.str("");
str << "Particle render: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_RENDER_PARTICLE);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
str.str("");
str << "Water render: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_RENDER_WATER);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
str.str("");
str << "Terrain render: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_RENDER_TERRAIN);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
str.str("");
str << "Objects render: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_RENDER_OBJECTS);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
str.str("");
str << "UI render: " << std::fixed << std::setprecision(2) << m_app->GetPerformanceCounterData(PCNT_RENDER_INTERFACE);
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
float otherRender = m_app->GetPerformanceCounterData(PCNT_RENDER_ALL) -
m_app->GetPerformanceCounterData(PCNT_RENDER_PARTICLE) -
m_app->GetPerformanceCounterData(PCNT_RENDER_WATER) -
m_app->GetPerformanceCounterData(PCNT_RENDER_TERRAIN) -
m_app->GetPerformanceCounterData(PCNT_RENDER_OBJECTS) -
m_app->GetPerformanceCounterData(PCNT_RENDER_INTERFACE);
str.str("");
str << "Other render: " << std::fixed << std::setprecision(2) << otherRender;
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height;
pos.y -= height;
str.str("");
str << "Triangles: " << m_statisticTriangle;
m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
pos.y -= height; pos.y -= height;