Нарезание резьбы с помощью Kinect
Я пишу приложение C#, которое использует Kinect, я беру выходные данные в данный момент и записываю их в ресурс шейдера и визуализирую его как текстуру, моя проблема заключается в том, что Kinect (по-видимому) работает только со скоростью 30 кадров в секунду, поэтому он плохо регулирует мою производительность.
Какой лучший способ преодолеть это, многопоточность? Есть ли какой-то шаблон дизайна, который помог бы с этим типом проблемы? Насколько я могу судить, я, возможно, захочу, чтобы kinect обрабатывал данные на поток, а затем получить доступ к нему, когда процесс будет завершен, но я не уверен, где начать с этого безопасным способом.
Спасибо за любой совет, который вы можете предложить.
В настоящее время я использую OpenNI для драйверов kinect/api и SlimDX для отрисовки directX.
2 ответа:
Я раньше не работал с Kinect, и вы не указали, какие драйверы / обертку вы используете, но я подозреваю, что это, вероятно, не будет иметь значения.
Вероятно, вам нужно будет сделать следующее:
- выделите цикл "Update"для Kinect на его собственный поток. Это позволит вашей логике приложения работать так быстро, как это возможно, не останавливаясь в ожидании обновления от оборудования kinect.
- вам нужно будет "заблокировать" данные изображения/глубины на каждый проход, пока kinect заполняет новые данные.
- Если процесс заполнения данных Kinect занимает два часа, Вы можете попробовать буферизировать данные изображения и глубины, если драйверы этого еще не сделали. Это означает просто хранить две копии в памяти и читать одну, пока другая записывается.
Для отличных учебных пособий по потоковой обработке в c# я всегда рекомендуюпотоковую обработку Альбахари в C#. Я также рекомендую, если вы хотите получить более конкретную информацию о том, что вы можете сделать, чтобы ускорить ваше приложение, вы, вероятно, должны отредактировать свой вопрос и добавить детали о том, как именно вы его структурировали сейчас и какой оберткой / драйвером вы используете и т. д.
Любая разработка с Kinect, требующая высокой производительности, должна использовать модель пула вместо модели событий. И в дополнение к этому, ваш лучший вариант-открыть поток и выполнить операции объединения. Вы можете использовать слишком много потоков с моделью событий, чтобы совершать длительные операции и не замораживать пользовательский интерфейс.
И вы можете видеть это: http://msdn.microsoft.com/en-us/library/hh973076