строка>. i), синтаксис которого приведен ниже:
#define START(L.TXT.TD static LogTime T##T1(#L.TXT);(T##T1).StartC):
Этот макрос объявляет переменную Ti класса LogTime и заполняет текущим временем ее поле S.
Объявление #define FINISH(Tl) (Т##Т1) .Finish() позволяет при помощи макроса FI NISH(i) занести текущее время в поле F той же переменной Ti.
Конструктором класса LogTime переменные Ti связываются в список. Удобство такого решения заключается в том, что переменные, в которых будут фиксироваться моменты времени, связываются в список конструктором еще до выполнения первого оператора программы. В точках записи макросов производится только фиксация времени, длящаяся доли микросекунды. При помощи метода LogFi leCchar *Fi 1 eName) класса LogHead содержимое списка выводится в файл FileName.
В листинге 22.8 показано, как в функцию рисования добавляется контроль отдельных операций.
Листинг 22.8
static LogHead L(3); //Заголовок списка контрольных точек. Время будет //записываться в переменные Ti при первых трех вызовах функции RenderOO void RenderKHWND hWnd) {
RECT R;
GetClientRect(hWnd.&R);
STARTCL."Накладные затраты".0) //Оценка затрат времени на запись
FINISH(O) //данных в контрольные точки.
STARTCL." Очистка".1) //Время начала очистки буфера продолжение xP"
Инициализация библиотек и вывод примитивов
Листинг 22.8 {продолжение)
glShadeModel (GLJLAT); glClearColorCl.Of.l.Of.l.Of.O.Of): glClear( GL_COLOR_BUFFER_BIT. // glFinishO:
FINISH(l) //Время завершения очистки буфера glViewport(O.O.R.right.R.bottom): // glFinishO;
START(L."Первый вывод примитивов".2) glBegin(GL_TRIANGLES); float i-0:
glColor3d ( 0.0. 1.0. 0.0): g1Vertex4d(-1.0. -1.0. -0.8. 1.0); glVertex4d( -1.0. 1.0. 1.0. 1.0); glVertex4d(1.0. 1.0. -0.8. 1.0):
//for( :i<l.Of: i-i+0.01f) //Вывод на экран 100 треугольников {
glColor3d (0.0. 1.0. 0.0); glVertex3d(0.25.i. 0.0): glColor3d (1.0. 0.0. 0.0); glVertex3d(0.8. 0.2. 0.0); glColor3d (0.0. 0.0. 1.0); glVertex3d(0.5. -i .0.0) : }