Appendix: Render Thread

Utilización de bloques con latencia constante y memoria pre-asignada

El diseño del subsistema de renderizado debe seguir una filosofía estrictamente determinista, donde cada bloque de procesamiento se ejecute con latencia constante, memoria preasignada y sincronización libre de bloqueos.

Esto garantiza que el grafo mantenga coherencia temporal incluso bajo carga sostenida, preservando continuidad auditiva y evitando degradaciones como dropouts, clicks o phase drift. El hilo de renderizado constituye el eje crítico: debe procesar bloques discretos de 64, 128 o 512 muestras según el hardware y la configuración del contexto.

Cada iteración debe completarse dentro del plazo exacto de su quantum.

Cualquier interrupción rompe la continuidad del flujo de audio. Por ello, el modelo de ejecución debe ser determinista y predecible, manteniendo grafos, estados internos y buffers en estructuras persistentes e inmutables durante todo el ciclo de render.

Memoria

El hilo de renderizado no debe realizar asignaciones dinámicas.

Todos los buffers y estructuras auxiliares deben reservarse durante la fase de inicialización, quedando fuera del heap durante el procesamiento. Se recomienda emplear pools preasignados y estructuras contiguas para minimizar cache misses.

Liberar memoria en el render thread constituye una violación de tiempo real.

Este principio se extiende a toda operación que active retención o liberación ARC, incluso en colecciones. Se deben preferir contenedores especializados, como arreglos de tamaño fijo o pilas preasignadas, que encapsulen memoria estática y acceso libre de bloqueos.

El sistema de enrutamiento debe evitar underruns y overruns mediante verificación explícita de punteros de lectura/escritura y sincronización del frameCount.

Todos los buffers circulares deben implementar index validation y reinicio de punteros.

Las rutas de señal deben conservar energía y fase, garantizando que los subgrafos permanezcan sincronizados dentro del mismo quantum. Esto elimina condiciones de carrera entre nodos y permite una propagación de señal consistente.

Sincronización

La ejecución en paralelo debe regirse por una política lock-free, evitando bloqueos.

Los accesos compartidos deben realizarse mediante variables atómicas y cualquier actualización proveniente de la UI (plano de control) debe transmitirse mediante colas unidireccionales asincrónicas, nunca por espera activa.

El hilo de renderizado debe ejecutarse con prioridad (SCHED_FIFO), y los hilos auxiliares deben operar con prioridad inferior evitando inversión de prioridad o starvation.

En entornos de alta demanda, el sistema debe prevenir la starvation ajustando dinámicamente la asignación de CPU y manteniendo las tareas críticas en un único núcleo lógico.

Las colas globales no deben competir con el hilo de renderizado.

El render thread siempre debe mantener una ejecución estrictamente determinista: sin asignaciones dinámicas, bloqueos ni dependencias externas.

Última actualización