Doom Wiki
Registrarse
Advertisement
Doom Wiki

Un Thinker (pensador) es una instancia de un gran número de estructuras diversas en el motor de Doom que se utilizan para implementar acciones programadas por tic dentro del mundo del juego. Los thinker están vinculados en una lista global de doble enlace que se itera hacia abajo una vez por tic, dando a cada objeto un turno para ejecutar su lógica para ese segmento de tiempo.

Esta es una implementación muy básica de un sistema multitarea cooperativa.

Tipos de thinker[]

Los siguientes tipos de objetos en el mundo del juego se implementan como thinkers en el motor del juego original:

Hexen agrega muchos nuevos tipos de thinkers en su personalización del motor Doom:

  • Scripts de ACS.
  • Efectos de suelo ondulado.
  • Pilares.
  • Temblores de tierra.
  • Poliobjetos.

Las portaciones (source ports) pueden ampliar significativamente el alcance de los thinkers para incluir nuevos efectos.

Pseudo-herencia[]

Aunque Doom fue escrito en el lenguaje C, que no está orientado de manera inherente a los objetos, los thinkers utilizan una técnica común en la programación en C llamada pseudo-herencia. Cada tipo de estructura que se comporta como un thinker contiene como primer miembro en su definición una instancia thinker_t.

Esto permite que los punteros a cualquiera de los diversos tipos de descendientes, como mobj_t, se conviertan desde y hacia un puntero a thinker_t. Cada thinker contiene un puntero a una función que se ejecutará cada tic que sea específico a su tipo derivado, como P_MobjThinker para mobj_t. La prueba del valor de esta función para determinar el tipo verdadero de una instancia de thinker_t se utiliza como una forma rudimentaria de información de tipo en tiempo de ejecución.

Como resultado de la similitud arquitectónica, la mayoría de los source ports C++ convierten este lenguaje en una jerarquía de clases completa; este es el caso tanto de ZDoom como de Eternity Engine.

Problemas[]

Integridad referencial[]

El motor original no implementa ninguna forma de conteo de referencias y, por lo tanto, es posible que los objetos que se eliminaron de la lista y se liberaron para ser referenciados o modificados posteriormente, den como resultado un comportamiento arbitrario o "indefinido", que puede provocar la corrupción de otros thinkers o la lista de thinkers en sí misma y, eventualmente, provocar un fallo.

Las Almas perdidas son particularmente propensas a los problemas relacionados con esto, porque cuando se vuelven invisibles al final de su secuencia de muerte, se liberan, lo que hace que cualquier monstruo aún enojado con ellas continúe haciendo referencia a la memoria no válida.

El source port Boom fue la primera implementación que corrigió este defecto mediante la adición del recuento de referencias. Algunas portaciones posteriores han reemplazado el esquema de conteo de referencias con la recolección de basura a gran escala.

Conflictos de lenguaje estándar[]

El esquema tipo punning utilizado para convertir los punteros de la estructura a su verdadero tipo desde thinker_t * es ilegal en el estándar de lenguaje C11 actual. Esto significa que los compiladores modernos de lenguaje C pueden no generar un código válido dado el código fuente de Doom a menos que se proporcionen interruptores de línea de comando especiales (como -fno-strict-aliasing para GCC).

Esto es cierto en particular cuando se solicitan altos niveles de optimización desde el compilador.

Advertisement