| 1 |
#include "stdafx.h" |
| 2 |
#include "HighTimer.h" |
| 3 |
#include "CJobTimer.h" |
| 4 |
|
| 5 |
CJobTimer g_JobTimer; |
| 6 |
|
| 7 |
//////////////////////////////////////////////////////////////////////////////// |
| 8 |
//////////////////////////////////////////////////////////////////////////////// |
| 9 |
|
| 10 |
CTimerObj::CTimerObj(const char* name) |
| 11 |
: m_FrameCount(-1) |
| 12 |
, m_IsStarted(false) |
| 13 |
, m_InactiveFrames(0) |
| 14 |
, m_OddFrame(0) |
| 15 |
{ |
| 16 |
SetName(name); |
| 17 |
} |
| 18 |
|
| 19 |
void CTimerObj::InitFrame(){ |
| 20 |
CFrameData &frame_data = m_FrameData[m_OddFrame]; |
| 21 |
if(frame_data.m_Data.size()){ |
| 22 |
frame_data.m_Data.clear(); |
| 23 |
m_InactiveFrames = 0; |
| 24 |
}else{ |
| 25 |
++m_InactiveFrames; |
| 26 |
} |
| 27 |
frame_data.m_Total = 0; |
| 28 |
} |
| 29 |
|
| 30 |
void CTimerObj::Start(){ |
| 31 |
if(m_FrameCount!=g_JobTimer.GetFrameCount()){ |
| 32 |
m_FrameCount = g_JobTimer.GetFrameCount(); |
| 33 |
InitFrame(); |
| 34 |
g_JobTimer.AddObj(this); |
| 35 |
} |
| 36 |
CFrameData &frame_data = m_FrameData[m_OddFrame]; |
| 37 |
if(m_IsStarted) ErrorDialog("CTimerObj::Start() [%s] Already started!", GetName()); |
| 38 |
m_IsStarted = true; |
| 39 |
frame_data.m_Data.push_back(CTimerData()); |
| 40 |
CTimerData &data = frame_data.m_Data.back(); |
| 41 |
data.m_Start = data.m_End = HighTimer(); |
| 42 |
} |
| 43 |
|
| 44 |
void CTimerObj::Stop(){ |
| 45 |
CFrameData &frame_data = m_FrameData[m_OddFrame]; |
| 46 |
if(!m_IsStarted) ErrorDialog("CTimerObj::Stop() [%s] Not started!", GetName()); |
| 47 |
CTimerData &data = frame_data.m_Data.back(); |
| 48 |
data.m_End = HighTimer(); |
| 49 |
frame_data.m_Total += data.GetDelta(); |
| 50 |
m_IsStarted = false; |
| 51 |
} |
| 52 |
|
| 53 |
void CTimerObj::Update(){ |
| 54 |
if(m_IsStarted) ErrorDialog("CTimerObj::Update() [%s] Already started!", GetName()); |
| 55 |
m_OddFrame = !m_OddFrame; |
| 56 |
} |
| 57 |
|
| 58 |
//////////////////////////////////////////////////////////////////////////////// |
| 59 |
//////////////////////////////////////////////////////////////////////////////// |
| 60 |
|
| 61 |
CJobTimer::CJobTimer() |
| 62 |
: m_OddFrame(0) |
| 63 |
, m_FrameCount(0) |
| 64 |
, m_SpanFrames(1) |
| 65 |
, m_SpanFrameCount(0) |
| 66 |
{ |
| 67 |
} |
| 68 |
|
| 69 |
void CJobTimer::Clear(){ |
| 70 |
CFrameData &frame_data = m_FrameData[m_OddFrame]; |
| 71 |
frame_data.m_ObjList.clear(); |
| 72 |
} |
| 73 |
|
| 74 |
void CJobTimer::AddObj( |
| 75 |
CTimerObj *obj // object |
| 76 |
){ |
| 77 |
CFrameData &frame_data = m_FrameData[m_OddFrame]; |
| 78 |
frame_data.m_ObjList.push_back(obj); |
| 79 |
} |
| 80 |
|
| 81 |
void CJobTimer::Start(){ |
| 82 |
#if ENABLE_JOB_TIMER |
| 83 |
++m_FrameCount; |
| 84 |
Clear(); |
| 85 |
CFrameData &frame_data = m_FrameData[m_OddFrame]; |
| 86 |
frame_data.m_Start = frame_data.m_End = HighTimer(); |
| 87 |
#endif |
| 88 |
} |
| 89 |
|
| 90 |
void CJobTimer::Stop(){ |
| 91 |
#if ENABLE_JOB_TIMER |
| 92 |
CFrameData &frame_data = m_FrameData[m_OddFrame]; |
| 93 |
frame_data.m_End = HighTimer(); |
| 94 |
unsigned int i; |
| 95 |
for(i = 0; i<frame_data.m_ObjList.size(); ++i){ |
| 96 |
frame_data.m_ObjList[i]->Update(); |
| 97 |
} |
| 98 |
m_OddFrame = !m_OddFrame; |
| 99 |
#endif |
| 100 |
} |
| 101 |
|
| 102 |
void CJobTimer::DrawResult(){ |
| 103 |
#if ENABLE_JOB_TIMER |
| 104 |
TIMER_RAII("CJobTimer::DrawResult()"); |
| 105 |
CFrameData &frame_data = m_FrameData[!m_OddFrame]; |
| 106 |
unsigned int i, j; |
| 107 |
static const double FRAME_UNIT = 1000.0/MAXFPS; // milliseconds |
| 108 |
const double delta = FromHighTimerCountToMs(frame_data.m_End-frame_data.m_Start); |
| 109 |
const int span_frames = (int)ceil(delta/FRAME_UNIT); |
| 110 |
if(span_frames<m_SpanFrames){ |
| 111 |
++m_SpanFrameCount; |
| 112 |
if(m_SpanFrameCount>MAXFPS) m_SpanFrames = span_frames; |
| 113 |
}else{ |
| 114 |
m_SpanFrames = span_frames; |
| 115 |
m_SpanFrameCount = 0; |
| 116 |
} |
| 117 |
const double rcp_span = 1.0/(FRAME_UNIT*m_SpanFrames); |
| 118 |
const int bar_height = FONT_HEIGHT; |
| 119 |
const int bar_hilite = 4; |
| 120 |
const int area_x = 50; |
| 121 |
const int area_y = g_DispHeight-50; |
| 122 |
const int area_width = g_DispWidth-200; |
| 123 |
const int area_height = bar_height*frame_data.m_ObjList.size(); |
| 124 |
const int number_width = 50; |
| 125 |
int pos_y = area_y; |
| 126 |
devResetMatrix(); |
| 127 |
devSetLighting(false); |
| 128 |
devSetTexture(0, 0); |
| 129 |
devBLEND_ALPHA(); |
| 130 |
Fill2DRect(area_x, area_y-area_height, area_x+area_width, area_y, 0x80000000); |
| 131 |
for(i = 0; i<frame_data.m_ObjList.size(); ++i){ |
| 132 |
CTimerObj* obj = frame_data.m_ObjList[i]; |
| 133 |
const CTimerObj::CFrameData &obj_frame = obj->GetFrameData(1); |
| 134 |
for(j = 0; j<obj_frame.m_Data.size(); ++j){ |
| 135 |
const CTimerObj::CTimerData &timer_data = obj_frame.m_Data[j]; |
| 136 |
const int bar_start = (int)(FromHighTimerCountToMs(timer_data.m_Start-frame_data.m_Start)*area_width*rcp_span); |
| 137 |
int bar_end = (int)(FromHighTimerCountToMs(timer_data.m_End-frame_data.m_Start)*area_width*rcp_span); |
| 138 |
if(bar_end==bar_start) bar_end=bar_start+1; |
| 139 |
Fill2DRect(area_x+bar_start, pos_y-bar_height, area_x+bar_end, pos_y, MultiplyColor(0xc0ff0000, j&1 ? 0xffc0c0c0 : 0xffffffff)); |
| 140 |
Fill2DRect(area_x+bar_start, pos_y-bar_hilite, area_x+bar_end, pos_y, j&1 ? 0x80c0c0c0 : 0x80ffffff); |
| 141 |
} |
| 142 |
pos_y -= bar_height; |
| 143 |
} |
| 144 |
Draw2DRect(area_x, area_y-area_height, area_x+area_width, area_y, 0xffffffff); |
| 145 |
for(i = 1; i<m_SpanFrames; ++i){ |
| 146 |
const int line_x = area_width*i/m_SpanFrames; |
| 147 |
Draw2DLine(area_x+line_x, area_y-area_height, area_x+line_x, area_y, 0xffffffff); |
| 148 |
} |
| 149 |
pos_y = area_y; |
| 150 |
const int str_base_x = area_x+number_width; |
| 151 |
for(i = 0; i<frame_data.m_ObjList.size(); ++i){ |
| 152 |
CTimerObj* obj = frame_data.m_ObjList[i]; |
| 153 |
const CTimerObj::CFrameData &obj_frame = obj->GetFrameData(1); |
| 154 |
const double frame_percent = FromHighTimerCountToMs(obj_frame.m_Total)*100.0/FRAME_UNIT; |
| 155 |
const int str_base_y = pos_y-bar_height; |
| 156 |
g_StrTex->RenderRight(str_base_x, str_base_y, 0xffffffff, 0, FlashIn("%.0lf x%d", frame_percent, obj_frame.m_Data.size())); |
| 157 |
g_StrTex->RenderLeft(str_base_x, str_base_y, 0xffffffff, 0, FlashIn(": %s", obj->GetName())); |
| 158 |
pos_y -= bar_height; |
| 159 |
} |
| 160 |
#endif |
| 161 |
} |