FANDOM

1.062 Páginas

Efecto Medusa

El efecto de Medusa se produce cuando hay más de un parche de pared ocupando la misma columna en cualquier textura media de una linedef de dos caras que sea visible en la pantalla. Debido a una limitación del motor del juego, éstas no se mostrarán correctamente.

El área donde se mostrará la textura del medio es en cambio una serie de líneas horizontales multicolores. Este "muro" de líneas multicolores parece extenderse infinitamente en el suelo. Acercarse a esa pared hará que la velocidad de fotogramas en Vanilla Doom se vuelva lenta a paso de tortuga y haga que el juego sea casi imposible hasta que la pared infractora quede fuera de la vista.

Aspectos técnicos

Para entender por qué ocurre esto, se requiere un conocimiento básico del motor de renderizado de Doom.

El efecto es debido a la forma en que las texturas multi-parche se cargan en la memoria. El juego hace que todas las texturas medias en paredes de dos lados con la misma función de dibujo como sprites, que es R_DrawMaskedColumn(). Esta función controla correctamente cada una de las columnas junto con los postes que forman la columna. El problema no radica en esta función, pero en cambia se presenta en el código que carga la textura en la memoria.

Cuando se dibuja una pared normal, se utiliza la función R_DrawColumn(). En la elaboración se utiliza la altura de la textura y no se tiene en cuenta ninguna información de offset y longitud contenida en los mensajes y ni siquiera se molesta en comprobar si hay otros mensajes para dibujar. Esta limitación también provoca el Efecto Tutti-frutti. Sin embargo, R_DrawMaskedColumn() sí toma en consideración el mensaje de offset y longitud.

Cuando una textura necesita ser cargada en la memoria, la función R_GenerateComposite() es llamada. Esta función carga los datos de la textura desde la WAD. Al cargar una textura, que se ejecuta a través de una lista que se determina en tiempo de carga. La lista contiene el número de parches que existen en cada columna, o más bien el número de bultos para cada columna. Cuando se encuentra una columna que tiene múltiples parches, el juego a continuación, llama R_DrawColumnInCache (). El problema surge en esta función. El R_DrawColumnInCache función () toma un atajo, que hace que la columna del parche en la parte superior de la memoria caché existente sin consultar al final de la columna y no actualiza el puesto existente de datos (longitud de desplazamiento y). Así, ni la altura, ni el desplazamiento de la columna / post están siempre actualizados. R_DrawMaskedColumn () y luego utiliza la información no válida. En resumen, después de dibujar un puesto de la función comprueba si hay más mensajes después (el valor 255 significa que hay más). Continuará dibujar mensajes de longitud variable y compensaciones, tirando de memoria sin relación fuera del montón zona hasta por casualidad un byte con el valor del marcador de 255 es golpeado, a la que luego terminará dibujo.

Dado que los datos reales para una textura varía, el marcador final puede detectarse temprano causando poca o ninguna desaceleración, o podría ser encontrado tarde, en cuyo caso produce una reducción extrema de la velocidad. En teoría, es posible que el juego se bloquee o congele indefinidamente si las condiciones son las apropiadas, sin embargo, siempre hay una posibilidad de 0,39% de aterrizar en un marcador final por cada byte dibujado.

Notas

El efecto toma el nombre de la Medusa, la mitológica criatura griega que tenía serpientes vivas a modo de cabello y era tan fea que una sola mirada convertiría a su espectador en piedra.

¡Interferencia de bloqueo de anuncios detectada!


Wikia es un sitio libre de uso que hace dinero de la publicidad. Contamos con una experiencia modificada para los visitantes que utilizan el bloqueo de anuncios

Wikia no es accesible si se han hecho aún más modificaciones. Si se quita el bloqueador de anuncios personalizado, la página cargará como se esperaba.

También en FANDOM

Wiki al azar