2011-06-08 14 views
13

Estoy escribiendo una aplicación C# que está utilizando el Kinect, tomo el resultado actualmente y lo escribo en un Shader Resource y lo renderizo como una textura, mi problema es que el Kinect (aparentemente) solo se ejecuta a 30 fps, por lo que está acelerando mi rendimiento.Enhebrado con Kinect

¿Cuál es la mejor manera de superar esto, es multihilo? ¿Hay algún tipo de patrón de diseño que ayudaría con este tipo de problema? Por lo que puedo decir es posible que desee que el kinect procese los datos en un hilo, y luego tenga acceso a él cuando el proceso haya finalizado, pero no estoy seguro por dónde empezar con eso de manera segura.

Gracias por cualquier consejo que pueda ofrecer.

Actualmente estoy usando OpenNI para los controladores kinect/api, y SlimDX para el lado directX de la representación.

+0

que no tienen experiencia con el Kinect, pero si se necesita una cantidad significativa de tiempo para procesar los datos, después de que los datos deben ser procesados ​​en un subproceso independiente, no la interfaz de usuario. Puede probar [Clase de trabajo en segundo plano] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx). – Centro

Respuesta

8

No he trabajado anteriormente con el Kinect y no especificó qué controladores/envoltorio está utilizando, pero sospecho que probablemente no importe.

Lo que es probable que tenga que hacer es lo siguiente: Separar el ciclo

  1. "Actualizar" para el Kinect en su propio hilo. Esto dejará la lógica de la aplicación libre para ejecutarse tan rápido como sea posible sin que se detenga la espera de una actualización desde el hardware de Kinect.
  2. Deberá "bloquear" los datos de la imagen/profundidad en cada pasada mientras el kinect rellena los datos nuevos.
  3. Si el proceso de llenado de datos de Kinect lleva dos largos, podría intentar almacenar en búfer la imagen y los datos de profundidad si los controladores no lo hacen. Esto significa simplemente mantener dos copias en la memoria y leer una mientras se escribe la otra.

Para obtener excelentes tutoriales sobre cómo enhebrar en C#, siempre recomiendo Albahari's Threading in C#. También recomendaría que si desea información más específica sobre lo que puede hacer para acelerar su aplicación, probablemente deba editar su pregunta y agregar detalles sobre cómo está estructurado y qué envoltura/controlador está usando, etc.

+0

Gracias por la respuesta, cuando implemente esto, arrojaré un código sobre lo que hice en caso de que alguien más se encuentre con este problema. – Craig

1

Cualquier desarrollo con Kinect que requiera un alto rendimiento debe usar el modelo de agrupación en lugar del modelo de evento. Y, para complementarlo, su mejor opción es abrir un hilo y realizar las operaciones de agrupamiento. También puede usar subprocesos con modelo de evento para realizar operaciones prolongadas y no congelar la interfaz de usuario.

Y se puede ver esto: http://msdn.microsoft.com/en-us/library/hh973076