Tengo problemas para distinguir la diferencia práctica entre llamar a glFlush()
y glFinish()
.opengl: glFlush() vs. glFinish()
Los documentos dicen que glFlush()
y glFinish()
impulsará todas las operaciones de búfer a OpenGL modo que uno puede estar seguro de que todos serán ejecutados, con la diferencia de que glFlush()
vuelve inmediatamente donde como glFinish()
bloques hasta que todas las operaciones se han completado.
Después de leer las definiciones, calculé que si tuviera que usar glFlush()
, probablemente me encontraría con el problema de enviar más operaciones a OpenGL de las que podría ejecutar. Así que, solo para intentarlo, cambié mi glFinish()
por un glFlush()
y he aquí, mi programa se ejecutó (por lo que pude ver), exactamente el mismo; velocidades de fotogramas, uso de recursos, todo era lo mismo.
Así que me pregunto si hay mucha diferencia entre las dos llamadas, o si mi código hace que funcionen no diferente. O donde uno debe ser usado vs. el otro. También calculé que OpenGL tendría alguna llamada como glIsDone()
para verificar si todos los comandos almacenados en un glFlush()
están completos o no (para que uno no envíe operaciones a OpenGL más rápido de lo que se pueden ejecutar), pero pude encontrar no tal función.
Mi código es el típico bucle del juego:
while (running) {
process_stuff();
render_stuff();
}
¿Qué quiere decir que glFlush "debe completar en tiempo FINITE" y luego decir, que glFlush No se ahogue porque "puede tomar CUALQUIER tiempo que necesite procesar tus comandos"? (Caps mina) ¿No son esos mutuamente exclusivos? – Praxiteles
Mientras termine en algún punto, cumple con los criterios de tiempo FINITE. Algunos controladores no-op esta llamada por completo. – chrisvarnz
SwapBuffers es específico del contexto y solo necesita vaciar el contexto del hilo de llamada. Si se renderizan múltiples contextos, cada uno debe enjuagarse manualmente, ya que no está garantizado que ocurra al intercambiar almacenamientos intermedios a través de otro contexto. – Andreas