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.
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.
Última actualización