Modo retenido
# Modo retenido

En computación gráfica, el modo retenido es un estilo de diseño de APIs en el que es la librería gráfica, en lugar de la aplicación, la que almacena o retiene el modelo de objetos o primitivas gráficas que va a ser renderizado. El modo alternativo se denomina modo inmediato y en él es la aplicación la que ejecuta las primitivas de dibujo directamente. Históricamente, el modo retenido ha sido el estilo dominante en librerías de construcción de GUI, sin embargo, los dos estilos pueden coexistir en la misma librería y en la práctica no son excluyentes.

Windows Presentation Foundation (WPF) es un ejemplo de API en modo retenido, Direct2D lo es del modo inmediato y en OpenGL existen ambas opciones.

## Descripción

Una API que utiliza el modo retenido tiene forma declarativa, las llamadas al API que utiliza la aplicación no causan un renderizado inmediato, sino que actualizan un modelo abstracto interno (una lista o árbol de objetos) en el propio espacio de datos de la librería.

La aplicación utiliza los elementos gráficos de alto nivel que proporciona la librería (formas geométricas, animaciones, texto), para formar una escena de objetos en memoria (normalmente en forma de grafo). Después, para dibujar un frame, la librería gráfica recorre dicha escena transformado los nodos en órdenes o llamadas a primitivas de dibujo más bajo nivel (líneas, rectángulos, curvas, texturas...). Cuando la aplicación quiere cambiar lo que se dibuja (por ejemplo, añadiendo una nueva forma), modifica la escena y es la librería gráfica la que se encarga de redibujar los cambios.

### Ventajas

Las APIs que utilizan el modo retenido tienen la ventaja de ser más sencillas de utilizar: no solo utilizan abstracciones de más alto nivel, sino que facilitan las tareas de creación, destrucción y modificación de los objetos gráficos. También puede optimizar el proceso de renderizado, aplicando de forma automática técnicas de buffer múltiple y determinación de caras ocultas.

### Inconvenientes

Por otro lado, como inconvenientes, tenemos una pérdida de flexibilidad, ya que el API impone su propio modelo de escena. Además, hay un mayor uso de memoria y pérdida de velocidad, debido a que se tiene que crear y mantener en memoria un modelo más genérico de escena.

