В MFC-программе, которую я создал сам, у меня есть некоторые странные проблемы с использованием процессора.
Я загружаю облако точек около 360 тыс. Точек, и все работает нормально (я использую буферы VBO, как это сделать из того, что я понимаю?). Я могу перемещать его по своему усмотрению и не замечать побочных эффектов (загрузка процессора очень низкая, GPU выполняет всю работу). Но затем при определенных углах и значениях масштабирования я вижу всплеск процессора на одном из моих процессоров! Затем я могу изменить угол или немного увеличить изображение, и оно снова опустится до 0. Это чаще происходит в большом окне, чем в маленьком.
Я измеряю FPS программы, и он постоянно равен 65, но когда происходит всплеск ЦП, он обычно падает примерно с 10 до 55. Я также измеряю время, которое занимает SwapBuffers, и при нормальной работе оно составляет около 0-1 мс. После того, как всплеск ЦП достигнет примерно 20 мс, становится ясно, что в этой функции что-то внезапно становится очень сложно вычислить (для GPU, я полагаю?). Этого чего-то нет в функции DrawScene (это та функция, которую можно ожидать, если съесть процессор в плохой реализации), поэтому я немного растерялся.
Я знаю, что это не из-за количества видимых точек, потому что это может происходить так же легко, как в подсекции данных, так и во всем облаке. Я попытался переместить это и посмотреть, связано ли это с буфером глубины, отсечкой или подобным, но это кажется совершенно случайным, какие углы создают проблему. Это кажется несколько повторяемым, хотя; перемещение модели в положение, которое когда-то было медленным, будет слишком медленным, если его переместить туда снова.
Я очень новичок в OpenGL, поэтому не исключено, что я совершил совершенно очевидную ошибку.
Вот так выглядит цикл рендеринга (он запускается в приложении MFC через событие таймера с периодом 1 мс):
// Clear color and depth buffer bits
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Draw OpenGL scene
OGLDrawScene();
unsigned int time1 = timeGetTime();
// Swap buffers
SwapBuffers(hdc);
// Calculate execution time for SwapBuffers
m_time = timeGetTime() - time1;
// Calculate FPS
++m_cnt;
if (timeGetTime() - m_lastTime > 1000)
{
m_fps = m_cnt;
m_cnt = 0;
m_lastTime = timeGetTime();
}