OpenGL в Windows использует тонны процессора, когда SwapBuffers вызывается на RenderThread - PullRequest
6 голосов
/ 14 мая 2011

Хорошо, поэтому я столкнулся с некоторыми проблемами с OpenGL в Windows.Я использую C # .NET, чтобы обернуть GL.Я на Windows7 x64.

Итак, я попробовал два разных теста.В каждом тесте я рисую нетекстурированный четырехугольник (он же два треугольника).Судя по всему, попадание в ЦП связано с SwapBuffers.

Однопоточный тест (Это прекрасно работает) ::

{
Draw stuff;
SwapBuffers;
Sleep(15);
}

Тест RenderingThread (Это съедает весь мой ЦП)::

{
Draw stuff;
SwapBuffers;
//glFinish(); //<< If used this seems to make the CPU usage normal
Sleep(15);
}

Я знаю, что этот пример упрощен, но реальный вопрос заключается в том, почему OpenGL высасывает весь мой ЦП при вызове SwapBuffers в другом потоке, отличном от того, в котором работает поток Windows GUI ??И почему glFinish (), кажется, исправляет это?Все говорят, что не следует использовать glFinish, поэтому я не уверен, что делаю неправильно, или если OpenGL просто отстой в Windows ...?

Я запускаю тот же тест для OSX, процессор кажется нормальным.Я запускаю тот же тест с D3D9 и D3D10 на Windows, процессор кажется нормальным.Не тестировался на Linux, так как мой L-box не работает.

1 Ответ

1 голос
/ 05 февраля 2012

Эта проблема просто решается с помощью:

glFlush();
glFinish();

Перед вызовом ::

wglSwapBuffers(dc); // Windows
glxSwapBuffers(dc, handle); // Linux
cglFlushDrawable(ctx); // OS X

Хотя драйверы имеют большое значение с OpenGL для Windows, и Windows по-прежнему работает намного лучшес Direct3D.

...