К основному контенту

Замеряем скорость выполнения команд OpenGL


Самый простой вариант, это обозначить тестируемый блок команд вызовами 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 дожидаться подтверждения выполнения.

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;


Вот собственно и всё, немного путано... но возможно позже чуток дополню, ели не забуду ))









Комментарии

Популярные сообщения из этого блога

Ray marching и не только

Давненько я не баловался фракталами, а руки что-то чешутся... Видимо пора сотворить что-то и поделиться с миром ) Но всё меняется, вернее давно поменялось, фракталы уже давно рисуются шейдерами, как правило фрагментными. И то что я когда то делал (ковёр Серпинского, остора Коха и другое - на основе линий) - увы, уже не впечатляет ;) Скрины 3d фракталов впечатляют и завораживают, глядя на некоторые даже не верится, что их сотворил алгоритм. Для визуализации поверхности, которая не определена полигонами, мы попробуем использовать ray marching (raymarching, марширующий луч, марш луча, ну в общем за точность перевода не ручаюсь), а результат думаю скоро сами увидим )) Важно заметить, что эта техника используется не только для рисования фракталов. И так, в чём же суть? Всё очень просто.  Допустим у нас есть, некая поверхность, точка наблюдателя (позиция камеры, глаза), есть луч, направленный из позиции наблюдателя. Теперь мы начинаем продвигаться по лучу (маршировать). На каждом ша

Релиз OpenGL 4.6

Уже все думали, что OpenGL умер, ну или погружается в сон, а вот и выстрелило)) В ядро были включены следующие расширения: GL_ARB_indirect_parameters GL_ARB_pipeline_statistics_query GL_ARB_polygon_offset_clamp  GL_KHR_no_error - позволяет отключать код проверки ошибок GL_ARB_shader_atomic_counter_ops - атомарные счётчики GL_ARB_shader_draw_parameters GL_ARB_shader_group_vote GL_ARB_gl_spirv - использование SPIR-V в OpenGL GL_ARB_spirv_extensions GL_ARB_texture_filter_anisotropic - анизотропная фильтрация для текстур GL_ARB_transform_feedback_overflow_query Так же добавили расширений : GL_KHR_parallel_shader_compile WGL_ARB_create_context_no_error GXL_ARB_create_context_no_error Спецификация OpenGL 4.6 Спецификация GLSL 4.6 NVIDIA уже представила бета версию драйвера , с поддержкой новой версии OpenGL 4.6, по ходу дела - nvidia пытается воскресить opengl, ну или хотя бы продлить его существование... Многие уже пытались поставить крест на этом г