malito - el cuentacuentos hora de aventura
Érase una vez, cuando> era más rápido que<... Espera, ¿qué? (4)
Si entiendo correctamente, en lo que respecta al rendimiento, voltear el signo de Z y la prueba de profundidad no es más que cambiar una <comparación a una> comparación. Entonces, si entiendo correctamente y el autor no está mintiendo o inventando cosas, entonces cambiar a <> solía ser una optimización vital para muchos juegos.
No lo expliqué particularmente bien, porque no era importante. Simplemente sentí que era un poco de curiosidad interesante para agregar. No tenía la intención de revisar el algoritmo específicamente.
Sin embargo, el contexto es clave. Nunca dije que una comparación era más rápida que una comparación. Recuerde: estamos hablando de pruebas de profundidad de hardware de gráficos, no de su CPU. No operator<
.
A lo que me refería era a una antigua optimización específica donde en un cuadro GL_LESS
con un rango de [0, 0.5]. En el siguiente fotograma, renderiza con GL_GREATER
con un rango de [1.0, 0.5]. Usted va hacia adelante y hacia atrás, literalmente "volteando el signo de Z y la prueba de profundidad" en cada cuadro.
Esto pierde un poco de precisión de profundidad, pero no tuvo que borrar el búfer de profundidad, que una vez fue una operación bastante lenta. Dado que la limpieza en profundidad no solo es gratuita en estos días sino que en realidad es más rápida que esta técnica, las personas ya no lo hacen.
Estoy leyendo un impresionante tutorial de OpenGL . Es realmente genial, confía en mí. El tema en el que estoy actualmente es Z-buffer. Además de explicar de qué se trata, el autor menciona que podemos realizar pruebas de profundidad personalizadas, como GL_LESS, GL_ALWAYS, etc. También explica que el significado real de los valores de profundidad (que es superior y cuál no) también puede ser personalizado Lo entiendo hasta ahora. Y entonces el autor dice algo increíble:
El rango zNear puede ser mayor que el rango zFar; si es así, entonces los valores del espacio de la ventana se invertirán, en términos de lo que constituye el más cercano o más alejado del espectador.
Anteriormente, se dijo que el valor Z del espacio de la ventana de 0 es el más cercano y el 1 es el más lejano. Sin embargo, si nuestros valores de espacio de clip Z se negaran, la profundidad de 1 sería la más cercana a la vista y la profundidad de 0 sería la más lejana. Sin embargo, si cambiamos la dirección de la prueba de profundidad (GL_LESS a GL_GREATER, etc.), obtenemos el mismo resultado exacto. Así que en realidad es sólo una convención. De hecho, voltear el signo de Z y la prueba de profundidad fue una vez una optimización de rendimiento vital para muchos juegos.
Si entiendo correctamente, en lo que respecta al rendimiento, voltear el signo de Z y la prueba de profundidad no es más que cambiar una <
comparación a una >
comparación. Entonces, si entiendo correctamente y el autor no está mintiendo o inventando cosas, entonces cambiar a <
>
solía ser una optimización vital para muchos juegos.
¿Está el autor inventando cosas, estoy malinterpretando algo, o es realmente el caso que una vez fue <
más lento ( vitalmente , como dice el autor) que >
?
Gracias por aclarar este asunto bastante curioso!
Descargo de responsabilidad: soy plenamente consciente de que la complejidad del algoritmo es la fuente principal para las optimizaciones. Además, sospecho que hoy en día definitivamente no haría ninguna diferencia y no estoy pidiendo esto para optimizar nada. Solo soy extremadamente, dolorosamente, quizás prohibitivamente curioso.
La optimización de este tipo afectará el rendimiento de muchas soluciones gráficas integradas porque hará que la resolución del framebuffer sea menos eficiente. Borrar un búfer es una señal clara para el controlador de que no es necesario que almacene y restaure el búfer al agrupar.
Poca información de fondo: un rasterizador de mosaico / compartimiento procesa la pantalla en un número de mosaicos muy pequeños que caben en la memoria en chip. Esto reduce las escrituras y las lecturas en la memoria externa, lo que reduce el tráfico en el bus de memoria. Cuando se completa un marco (se llama swap, o se eliminan los FIFO porque están llenos, cambian los enlaces del marcador de marco, etc.) se debe resolver el framebuffer; esto significa que cada bin se procesa a su vez.
El conductor debe asumir que los contenidos anteriores deben ser preservados. La preservación significa que el contenedor debe escribirse en la memoria externa y luego restaurarse desde la memoria externa cuando el contenedor se procesa nuevamente. La operación de limpieza le dice al controlador que el contenido de la bandeja está bien definido: el color claro. Esta es una situación que es trivial de optimizar. También hay extensiones para "descartar" los contenidos del búfer.
La respuesta es casi segura que, independientemente de la encarnación de chip + driver que se usó, el Jerarchical Z solo funcionó en una sola dirección: este era un problema bastante común en aquellos tiempos. El ensamblaje / ramificación de bajo nivel no tiene nada que ver con eso: el almacenamiento en búfer Z se realiza en hardware de función fija, y se canaliza. No hay especulación y, por lo tanto, no hay predicción de ramificación.
Tiene que ver con los bits de bandera en un ensamblaje altamente afinado.
x86 tiene instrucciones jl y jg, pero la mayoría de los procesadores RISC solo tienen jl y jz (no jg).