Doom Wiki
Advertisement
Doom Wiki


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 visibles 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.

Efecto Medusa

Captura de pantalla de un efecto Medusa.

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 renderiza todas las texturas intermedias en paredes de dos lados con la misma función de dibujo que los 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 es necesario cargar una textura en la memoria, se llama a la función R_GenerateComposite(). Esta función carga los datos de la textura desde la WAD en uso. Al cargar una textura, se ejecuta a través de una lista que se determinó en el momento de la carga. La lista contiene el número de parches que existen en cada columna, o más bien el número de lumps para cada columna. Cuando se encuentra una columna que tiene múltiples parches, el juego a continuación, llama R_DrawColumnInCache () y el problema surge en esta función.

La función R_DrawColumnInCache() toma un atajo, representa la columna del parche en la parte superior de la caché existente sin verificar el final de la columna y no actualiza los datos de la publicación existente (desplazamiento y longitud). Por lo tanto, ni la altura ni el desplazamiento de la columna / publicación se actualizan nunca.

R_DrawMaskedColumn () luego usa la información no válida. En resumen, después de dibujar una publicación, la función comprueba si hay más publicaciones después (el valor 255 significa que no hay más). Continuará dibujando publicaciones de diferentes longitudes y desplazamientos, extrayendo la memoria no relacionada de la Zona de memoria hasta que, por casualidad, se tope con un byte con el valor de marcador de 255, en el que luego terminará el dibujo.

Dado que los datos reales de una textura varían, el marcador final se puede encontrar temprano, lo que provoca poca o ninguna ralentización, o se puede encontrar tarde cuando provoca una ralentización extrema. En teoría, es posible que el juego se bloquee o se congele indefinidamente si las condiciones son correctas, sin embargo, siempre hay una probabilidad del 0.39% de caer en un marcador de final con 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.

Véase también[]

Advertisement