2016-05-20 9 views
1

Я использую многопоточный OpenGL для визуализации в окно. Если я нажму кнопку, модель будет повернута на 5 секунд. После этого поворота я распечатываю FPS. В остальное время OpenGL ничего не делает. Модель не будет изменяться со временем, и все потоки будут приостановлены во время вращения. В начале у меня есть 240FPS после 30 раз с помощью этой кнопки (а также до тех пор, пока все не закончится) мой FPS упадет до 30FPS (выглядит очень медленно).SwapBuffers медленно замедляются с течением времени

Моя петля выглядит так, я также пробовал другие комбинации, такие как удаление glFlush и glFinish.

pDriverOpenGL->Lock(); 
pDriverOpenGL->Present(this); //drawcall 
glFlush(); 
glFinish(); 
//glFlush(); 
SwapBuffers(hdc); 
pDriverOpenGL->Unlock(); 

Я пропустил какую-то команду? Я также читал, что команды GL укладываются в буфер до вызова glFlush. Это правда? Может ли кто-нибудь рассказать мне, как работает этот стек? и как я могу его очистить?

Кстати, я использую Windows 10, AMD Radeon R7 M370

Спасибо заранее!

+0

Этот код недостаточно, чтобы рассказать вам, что не так. Нам нужен призыв розыгрыша, а также блокировка и разблокировка. У вас могут быть утечки или медленные операции. – Brandon

+0

Спасибо за ваш быстрый ответ! с GPU-Z TechPowerUp Я проверил память GPU, а также TaskManager не меняет память ... так что утечки памяти нет. Я не могу распечатать код здесь, он очень велик и нелегко входить ... (это готовый проект, который работает с DirectX 11, и я должен написать драйвер OpenGL для работы с Linus OSX ...) – Thomas

+0

Но, может быть, вы знаете больше о каком-то стекебуфере для хранения команд openGL до вызова glFlush. Это мне очень помогло! Благодаря! – Thomas

ответ

1

Я нашел свою ошибку ... Внутри «pDriverOpenGL-> Present (this);» Я использую

HDC hdc = GetDC(hWnd); 

после каждого вызова команды «GetDC», как-то медленнее. Теперь я только назову его 1 раз и сэкономлю HDC в качестве члена

Спасибо вам за помощь!

1

@ блокировка I инициализацияCriticalSection (& m_CS); И да, я уверен, что есть только один рисунок нити

Я предполагаю, что ваш код выше находится в цикле, и вы создаете каждый раз критический раздел, удаляете ли вы его? BTW: Вы должны создать критический раздел один раз и использовать EnterCriticalSection/LeaveCriticalSection в Lock/Unlock.

+0

В linux нет типа критического сечения как такового. Его порт использовал бы что-то вроде спин-блокировки или мютекса posix. Поскольку '' Lock() '' является функцией-членом драйвера GL, который он написал, я бы счел маловероятным, чтобы он не инициализировал экземпляр синхронизации в конструкторе класса. – BitTickler

+0

ahh извините ... Я использую EnterCriticalSection (& m_CS) не InitializeCriticalSection (& m_CS) ... – Thomas

+0

InitializeCriticalSection (& m_CS) Я использую только в начале – Thomas