Самый простой вариант, это обозначить тестируемый блок команд вызовами glBeginQuery (GL_TIME_ELAPSED, id) и glEndQuery (GL_TIME_ELAPSED). Результат получаем командой glGetQueryObjectui64v или glGetQueryObjectuiv, в зависимости от разрядности счётчика, 32 бит может и не хватить (в наносекундах, как никак). Важное замечание, что за меряется только только затраченное на выполнение команд OpenGL.
Вариант №1:GLuint id; GLuint64 elapsedTime; glGenQueries(1, &id); // Начало блока glBeginQuery(GL_TIME_ELAPSED, id); //Тут пишем код, который надо проверить //Окончание проверяемого блока glEndQuery(GL_TIME_ELAPSED); // Тут могут быть другие команды OpenGL, скорость которых не надо замерять // получаем затраченное время в наносекундах glGetQueryObjectui64v(id, GL_QUERY_RESULT, &elapsedTime);
Вариант №2:
GLuint queryStart, queryEnd; // query id GLuint64 startTime, endTime; GLuint64 elapsedTime; // затраченное время в наносекундах glGenQueries ( 1, &queryStart ); glGenQueries ( 1, &queryEnd ); // Начинаем запрос glQueryCounter ( queryStart, GL_TIMESTAMP ); // Команды, время выполнения которых нас интересует // Окончание запроса glQueryCounter ( queryEnd, GL_TIMESTAMP ); // получаем затраченное время (ожидая готовности результата) glGetQueryObjectui64v(queryStart, GL_QUERY_RESULT, &startTime ); glGetQueryObjectui64v(queryEnd, GL_QUERY_RESULT, &endTime ); elapsedTime = endTime - startTime;
С glGetQueryObjectui64v в Убунте 14.04 у меня произошёл казус, линковщик отказывался находить main.cpp:(.text.startup+0x269)||undefined reference to `glGetQueryObjectui64v'|. Пришлось мне убирать в настройках проекта библиотеку lGL, и прописывать пусть конкретно к другому варианту /usr/lib/fglrx/libGL.so.1.2
В связи с тем, что команды уходят не дожидаясь выполнения предыдущих команд, рекомендуется перед вызовом glGetQueryObjectui64v дожидаться подтверждения выполнения.
В связи с тем, что команды уходят не дожидаясь выполнения предыдущих команд, рекомендуется перед вызовом glGetQueryObjectui64v дожидаться подтверждения выполнения.
int done = 0; while (!done) { glGetQueryObjectiv(query, GL_QUERY_RESULT_AVAILABLE, &done); }
// получаем затраченное время в наносекундах glGetQueryObjectui64v(id, GL_QUERY_RESULT, &elapsedTime);
Для получения текущего времени от GPU, можно использовать следующий код:
GLint64 time;
glGetInteger64v(GL_TIMESTAMP, &time);
Можно использовать, для получения затраченного времени на определённый блок кода (GPU и CPU), или для подсчёта fps.
GLint64 startTime, endTime; GLint64 elapsedTime; // Начальное время glGetInteger64v( GL_TIMESTAMP, &startTime); // Команды, время выполнения которых нас интересует // Конечное время glGetInteger64v( GL_TIMESTAMP, &endTime ); // Вычисляем реальное время elapsedTime = endTime - startTime; // Выводим результат в консоль std::cout << elapsedTime << std::endl;
Вот собственно и всё, немного путано... но возможно позже чуток дополню, ели не забуду ))
Комментарии
Отправить комментарий