2011-06-08 4 views
13

J'écris une application C# qui utilise le Kinect, je prends la sortie actuellement et l'écris à une ressource de shader et la restituer comme une texture, mon problème est que le Kinect (apparemment) fonctionne seulement à 30fps, donc il ralentit ma performance.Threading avec le Kinect

Quelle est la meilleure façon de surmonter cela, est-ce multithread? Y a-t-il une sorte de modèle de conception qui pourrait aider avec ce type de problème? Autant que je sache, je souhaite que le kinect traite les données sur un thread, puis y accède lorsque le processus est terminé, mais je ne sais pas par où commencer de manière sûre.

Merci pour tout conseil que vous pouvez offrir. Je suis actuellement en train d'utiliser OpenNI pour les pilotes kinect/api, et SlimDX pour le côté directX du rendu.

+0

Je n'ai aucune expérience avec le Kinect, mais si cela prend beaucoup de temps pour traiter les données, alors que les données doivent être traitées sur un thread séparé, et non l'interface utilisateur. Vous pouvez essayer [BackgroundWorker Class] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx). – Centro

Répondre

8

Je n'ai pas encore travaillé avec le Kinect et vous n'avez pas spécifié les pilotes/wrappers que vous utilisez, mais je suppose que cela n'aura probablement pas d'importance.

Ce que vous aurez probablement besoin de faire est la suivante:

  1. Separate cycle « Mise à jour » pour le Kinect sur son propre fil. Cela laissera la logique de votre application libre de s'exécuter aussi vite que possible sans être arrêté d'attendre une mise à jour du matériel kinect.
  2. Vous devrez "verrouiller" les données d'image/de profondeur à chaque passe pendant que la kinect remplit les nouvelles données.
  3. Si le processus de remplissage des données par Kinect prend deux longues minutes, vous pouvez essayer de mettre en mémoire tampon les données d'image et de profondeur si les pilotes ne le font pas déjà. Cela signifie simplement garder deux copies en mémoire et en lire une pendant l'écriture de l'autre.

Pour d'excellents tutoriels sur le threading en C#, je recommande toujours Albahari's Threading in C#. Je recommanderais également si vous voulez des informations plus spécifiques sur ce que vous pouvez faire pour accélérer votre application, vous devriez probablement éditer votre question et ajouter des détails sur comment vous l'avez structuré maintenant et quel wrapper/driver vous utilisez, etc

+0

Merci pour la réponse, quand je mets en œuvre ce que je vais jeter du code sur ce que j'ai fait au cas où quelqu'un d'autre se heurte à ce problème. – Craig

1

Tout développement avec Kinect nécessitant des performances élevées, vous devez utiliser le modèle de pooling à la place du modèle d'événement. Et complémentaire à cela, votre meilleure option est d'ouvrir un fil et faire les opérations de mise en commun. Vous pouvez utiliser trop de threads avec le modèle d'événement, pour effectuer des opérations longues et ne pas geler l'interface utilisateur.

Et vous pouvez voir ceci: http://msdn.microsoft.com/en-us/library/hh973076