Como trocar o buffer o mais rápido possível

Eu estou trabalhando no projeto OpenGL e estou usando o VS15 C ++.
Meu código:

timeBeginPeriod(1); //start timer to measure the gap GetSystemTime(&timeMiddle); timeMiddleLong = (timeMiddle.wMinute * 60 * 1000) + (timeMiddle.wSecond * 1000) + timeMiddle.wMilliseconds; myfile << "middle time = " << timeMiddleLong << endl; glClearColor(1.0f, 0, 0, 1.0f);//red screen //update screen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); SwapBuffers(hdc); glfwPollEvents(); Sleep(1); //sleep for ~2ms glClearColor(0, 0, 0, 0);//invisiable screen //update screen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); SwapBuffers(hdc); glfwPollEvents(); //stop timer and print to file the result GetSystemTime(&timeEnd); timeEndLong = (timeEnd.wMinute * 60 * 1000) + (timeEnd.wSecond * 1000) + timeEnd.wMilliseconds; myfile << "gap = " << timeEndLong - timeMiddleLong << endl; ReleaseDC(hWnd, hdc); 

O que eu quero ?
Para alternar entre uma canvas vermelha e canvas invisível o mais rápido possível.
O que eu sei ?
Meu monitor é 60Hz com tempo de resposta de aproximadamente 7ms, o que significa que se o monitor atualizar exatamente quando a canvas vermelha estiver ativa, ele permanecerá 13ms.
O que eu ganho ?
Ao filmar a canvas, notei que a canvas vermelha fica por ~ 32ms, o que é muito longo para mim.
Além disso, as lacunas mostram valores de ~ 2ms na maior parte do tempo e em algumas vezes 5-9ms

Como faço para mostrar a canvas vermelha pelo menor tempo? e quanto tempo vai ser?

Sua abordagem não funcionará – todas as funções do OpenGL, incluindo os SwapBuffers, podem ser enfileiradas e executadas na GPU muito depois de o fragment de código ter sido concluído.

Em vez disso, certifique-se de que o VSync esteja ativado (normalmente, é por padrão) e execute todos esses comandos sem dormir no meio:

 glClearColor(1.0f, 0, 0, 1.0f);//red screen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); SwapBuffers(hdc); glClearColor(0, 0, 0, 0); //invisiable screen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); SwapBuffers(hdc); 

Isso irá piscar uma canvas vermelha para exatamente um quadro (16,7ms para um monitor de 60Hz).

Devido à natureza assíncrona do OpenGL, suas medições de tempo também não são sensatas. Você deve usar o OpenGL Time Query Objects para medir os tempos no lado da GPU.