Posterior a observar en diversos repositorios y sitios webs finalmente hemos dado con la respuesta que te enseñaremos ahora.
Solución:
No puede utilizar ningún lenguaje principal de recolección de basura para “sistemas duros en tiempo real”, ya que la recolección de basura a veces detendrá la respuesta del sistema en un tiempo definido. Evitar la asignación de objetos puede ayudar, sin embargo, necesita una forma de demostrar no está creando basura y el recolector de basura no se activará.
Sin embargo, la mayoría de los sistemas de “tiempo real” no necesitan responder siempre dentro de un límite de tiempo estricto, por lo que todo se reduce a hacer lo que quiere decir con “tiempo real”.
Incluso cuando las partes del sistema necesitan ser “duras en tiempo real”, a menudo otras piezas grandes del sistema como la interfaz de usuario no.
(Creo que su aplicación debe ser rápida en lugar de “en tiempo real”, si se pierde 1 cuadro cada 100 años, ¿cuántas personas morirán?)
He usado C# para crear varias aplicaciones de visión artificial en tiempo real y de alta velocidad que se ejecutan las 24 horas del día, los 7 días de la semana y tienen maquinaria en movimiento que depende de la aplicación. Si algo sale mal en el software, algo sale mal de forma inmediata y visible en el mundo real.
Descubrí que C#/.Net proporciona una funcionalidad bastante buena para hacerlo. Como han dicho otros, definitivamente manténgase al tanto de la recolección de basura. Dividir el procesamiento en varios pasos lógicos y tener subprocesos separados trabajando cada uno. Descubrí que el modelo de programación Producer Consumer funciona bien para esto, tal vez ConcurrentQueue para empezar.
Podrías empezar con algo como:
- El subproceso 1 captura la imagen de la cámara, la convierte a algún formato y la coloca en un ImageQueue
- El subproceso 2 consume de ImageQueue, procesa la imagen y genera un objeto de datos que se coloca en ProcessedQueue.
- El subproceso 3 consume de ProcessedQueue y hace algo interesante con los resultados.
Si el subproceso 2 tarda demasiado, los subprocesos 1 y 3 seguirán avanzando. Si tiene un procesador multinúcleo, estará lanzando más hardware a las matemáticas. También podría usar varios hilos en lugar de cualquier hilo que escribí anteriormente, aunque tendría que encargarse de ordenar los resultados manualmente.
Editar
Después de leer las respuestas de otras personas, probablemente podría discutir mi definición de “tiempo real”. En mi caso, la computadora produce objetivos que envía a los controladores de movimiento que realizan el movimiento real en tiempo real. Los controladores de movimiento proporcionan sus propias capas de seguridad para cosas como sincronización, rangos máximos/mínimos, aceleraciones/desaceleraciones suaves y sensores de seguridad. Estos controladores leen sensores en toda una fábrica con un tiempo de ciclo de menos de 1 ms.
Absolutamente. los key será evitar la recolección de basura y la gestión de la memoria tanto como sea posible. Trate de evitar los objetos nuevos en la medida de lo posible, utilizando búferes o grupos de objetos cuando pueda.