This commit is contained in:
Irlan 2019-03-30 10:48:24 -03:00
parent 4984fa2a2e
commit 812ee84d7e
8 changed files with 69 additions and 67 deletions

View File

@ -75,7 +75,7 @@ void JsonProfiler::EndEvents()
m_file = nullptr;
}
void JsonProfiler::BeginEvent(i32 tid, i32 pid, const char* name, float64 t)
void JsonProfiler::BeginEvent(const char* name, float64 t)
{
if (!m_writer)
{
@ -87,8 +87,8 @@ void JsonProfiler::BeginEvent(i32 tid, i32 pid, const char* name, float64 t)
float64 scale = 1000.0;
m_writer->StartObject();
m_writer->STRING("pid"); m_writer->Int(pid);
m_writer->STRING("tid"); m_writer->Int(tid);
m_writer->STRING("pid"); m_writer->Int(0);
m_writer->STRING("tid"); m_writer->Int(0);
m_writer->STRING("ts"); m_writer->Int64((u64)(t * scale));
m_writer->STRING("ph"); m_writer->String(phase, 1);
m_writer->STRING("cat"); m_writer->STRING("physics");
@ -97,7 +97,7 @@ void JsonProfiler::BeginEvent(i32 tid, i32 pid, const char* name, float64 t)
m_writer->EndObject();
}
void JsonProfiler::EndEvent(i32 tid, i32 pid, const char* name, float64 t)
void JsonProfiler::EndEvent(const char* name, float64 t)
{
if (!m_writer)
{
@ -109,8 +109,8 @@ void JsonProfiler::EndEvent(i32 tid, i32 pid, const char* name, float64 t)
float64 scale = 1000.0;
m_writer->StartObject();
m_writer->STRING("pid"); m_writer->Int(pid);
m_writer->STRING("tid"); m_writer->Int(tid);
m_writer->STRING("pid"); m_writer->Int(0);
m_writer->STRING("tid"); m_writer->Int(0);
m_writer->STRING("ts"); m_writer->Int64((u64)(t * scale));
m_writer->STRING("ph"); m_writer->String(phase, 1);
m_writer->STRING("cat"); m_writer->STRING("physics");

View File

@ -43,9 +43,9 @@ public:
void EndEvents();
void BeginEvent(i32 tid, i32 pid, const char* name, float64 time);
void BeginEvent(const char* name, float64 time);
void EndEvent(i32 tid, i32 pid, const char* name, float64 time);
void EndEvent(const char* name, float64 time);
private:
FILE * m_file;
FileWriteStream* m_stream;

View File

@ -124,8 +124,7 @@ static void Run()
for (u32 i = 0; i < records.Count(); ++i)
{
const ProfilerRecord& r = records[i];
if (r.elapsed > 0.0)
if (r.call != 0)
{
g_draw->DrawString(b3Color_white, "%s %.4f (%.4f) [ms]", r.name, r.elapsed, r.maxElapsed);
}
@ -140,7 +139,7 @@ static void Run()
g_profiler->PopEvent();
g_profiler->End(g_profilerListener);
g_profiler->End();
glfwSwapBuffers(g_window);
glfwPollEvents();

View File

@ -35,26 +35,24 @@ void Profiler::PushEvent(const char* name)
m_time.Update();
ProfilerEvent e;
e.tid = -1;
e.pid = -1;
e.t0 = m_time.GetCurrentMilis();
e.t1 = 0.0;
e.t1 = -1.0;
e.name = name;
e.parent = m_top;
ProfilerEvent* back = m_events.Push(e);
B3_ASSERT(back);
m_top = back;
m_events.PushBack(e);
m_top = &m_events.Back();
}
void Profiler::PopEvent()
{
B3_ASSERT(m_top);
B3_ASSERT(m_top->t1 == 0.0);
m_time.Update();
m_top->t1 = m_time.GetCurrentMilis();
B3_ASSERT(m_top->t1 != 0.0);
B3_ASSERT(m_top->t1 > m_top->t0);
m_top = m_top->parent;
}
@ -65,29 +63,31 @@ void Profiler::Begin()
B3_ASSERT(m_top == NULL);
}
void Profiler::End(ProfilerListener* listener)
void Profiler::End()
{
ProfilerListener* listener = g_profilerListener;
if (listener)
{
listener->BeginEvents();
}
while (m_events.IsEmpty() == false)
for (u32 i = 0; i < m_events.Count(); ++i)
{
ProfilerEvent e = m_events.Front();
m_events.Pop();
ProfilerEvent e = m_events[i];
if (listener)
{
listener->BeginEvent(e.tid, e.pid, e.name, e.t0);
listener->BeginEvent(e.name, e.t0);
listener->EndEvent(e.tid, e.pid, e.name, e.t1);
listener->EndEvent(e.name, e.t1);
listener->Duration(e.name, e.t1 - e.t0);
}
}
m_events.Resize(0);
B3_ASSERT(m_events.IsEmpty());
B3_ASSERT(m_top == NULL);

View File

@ -24,17 +24,11 @@
#include <bounce/common/template/queue.h>
#include <bounce/common/template/array.h>
// This defines the maximum number of profiler events that can be
// queued per frame until the function Profiler::End is called.
#define MAX_PROFILER_EVENTS 2048
class ProfilerListener;
// A time-stamped profiler event.
struct ProfilerEvent
{
i32 tid;
i32 pid;
const char* name;
float64 t0;
float64 t1;
@ -56,7 +50,7 @@ public:
// The function will report all events in this profiler
// to the given event listener in the correct calling order.
// This function also flushes the profiler.
void End(ProfilerListener* listener);
void End();
// Add a profiler event to the queue.
// You can control the maximum number of profiler events using
@ -67,7 +61,7 @@ public:
void PopEvent();
private:
b3Time m_time;
b3BoundedQueue<ProfilerEvent, MAX_PROFILER_EVENTS> m_events;
b3StackArray<ProfilerEvent, 256> m_events;
ProfilerEvent* m_top;
};
@ -86,19 +80,15 @@ public:
virtual void EndEvents() { }
// This function is called when a profiler event begins.
virtual void BeginEvent(i32 tid, i32 pid, const char* name, float64 time)
virtual void BeginEvent(const char* name, float64 time)
{
B3_NOT_USED(tid);
B3_NOT_USED(pid);
B3_NOT_USED(name);
B3_NOT_USED(time);
}
// This function is called when a profiler event ends.
virtual void EndEvent(i32 tid, i32 pid, const char* name, float64 time)
virtual void EndEvent(const char* name, float64 time)
{
B3_NOT_USED(tid);
B3_NOT_USED(pid);
B3_NOT_USED(name);
B3_NOT_USED(time);
}

View File

@ -22,7 +22,7 @@ RecorderProfiler* g_profilerRecorder = nullptr;
void RecorderProfiler::BeginEvents()
{
m_count = 0;
m_call = 0;
for (u32 i = 0; i < m_records.Count(); ++i)
{
m_records[i].elapsed = 0.0;
@ -43,33 +43,45 @@ void RecorderProfiler::EndEvents()
if (r2.call < r1.call)
{
b3Swap(r1, r2);
break;
}
}
}
}
void RecorderProfiler::Add(const char* name, float64 elapsedTime)
ProfilerRecord* RecorderProfiler::FindRecord(const char* name)
{
m_count += 1;
for (u32 i = 0; i < m_records.Count(); ++i)
{
ProfilerRecord& r = m_records[i];
if (r.name == name)
{
r.elapsed += elapsedTime;
r.maxElapsed = b3Max(r.maxElapsed, elapsedTime);
r.call = m_count;
return;
return &r;
}
}
return nullptr;
}
void RecorderProfiler::Add(const char* name, float64 elapsedTime)
{
B3_ASSERT(elapsedTime >= 0.0);
++m_call;
ProfilerRecord* fr = FindRecord(name);
if (fr)
{
fr->elapsed += elapsedTime;
fr->maxElapsed = b3Max(fr->maxElapsed, elapsedTime);
fr->call = m_call;
return;
}
ProfilerRecord r;
r.name = name;
r.elapsed = elapsedTime;
r.maxElapsed = elapsedTime;
r.call = m_count;
r.call = m_call;
m_records.PushBack(r);
}

View File

@ -25,9 +25,9 @@
// An event in the profiler event recorder.
struct ProfilerRecord
{
const char* name;
float64 elapsed;
float64 maxElapsed;
const char* name;
u32 call;
};
@ -43,10 +43,12 @@ public:
void Add(const char* name, float64 elapsedTime);
ProfilerRecord* FindRecord(const char* name);
const b3Array<ProfilerRecord>& GetRecords() const { return m_records; }
private:
b3StackArray<ProfilerRecord, 256> m_records;
u32 m_count;
b3StackArray<ProfilerRecord, 256> m_records; // persistent records sorted by call order
u32 m_call;
};
extern RecorderProfiler* g_profilerRecorder;

View File

@ -54,25 +54,24 @@ public:
}
void BeginEvent(i32 tid, i32 pid, const char* name, float64 time) override
void BeginEvent(const char* name, float64 time) override
{
#if (PROFILE_JSON == 1)
m_jsonListener.BeginEvent(tid, pid, name, time);
m_jsonListener.BeginEvent(name, time);
#endif
}
void EndEvent(const char* name, float64 time) override
{
#if (PROFILE_JSON == 1)
m_jsonListener.EndEvent(name, time);
#endif
}
void EndEvent(i32 tid, i32 pid, const char* name, float64 time) override
void Duration(const char* name, float64 duration) override
{
#if (PROFILE_JSON == 1)
m_jsonListener.EndEvent(tid, pid, name, time);
#endif
}
void Duration(const char* name, float64 time) override
{
m_recorderProfiler.Add(name, time);
m_recorderProfiler.Add(name, duration);
}
RecorderProfiler m_recorderProfiler;