Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/CJobTimer.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9 - (show annotations) (download) (as text)
Tue Aug 28 14:58:05 2012 UTC (11 years, 8 months ago) by okadu
File MIME type: text/x-c++src
File size: 5362 byte(s)
[okadu] Version 2.14
ニュートラル画面分割
ダイヤ停車位置の数値設定
レイアウト読み込みバグ一部修正

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 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26