Я знаю, что есть лучший способ сделать это. Я довольно новичок в многопоточном программировании, однако повышение моего события в новом потоке, подобном приведенному ниже коду, позволяет моему приложению получать более высокий FPS с Kinect.
Когда объект моего класса KinectService инициализируется, внутри этого метода я делаю это:
Thread t = new Thread(() =>
{
sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(sensor_AllFramesReady);
KinectSensor.KinectSensors.StatusChanged += new EventHandler<StatusChangedEventArgs>(Kinects_StatusChanged);
});
t.Start();
Который в свою очередь вызывает этот метод:
void sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
{
using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
{
if (depthFrame == null)
{
return;
}
byte[] pixels = GenerateColoredBytes(depthFrame);
int stride = depthFrame.Width * 4;
BitmapSource test = BitmapSource.Create(depthFrame.Width, depthFrame.Height,
96, 96, PixelFormats.Bgr32, null, pixels, stride);
test.Freeze();
if (FrameChanged != null)
{
FrameChanged(test);
}
}
}
FrameChanged (test) передает вновь созданное растровое изображение обратно в модель представления, которая затем обновляет источник изображения. Это ужасный способ сделать это? Выдавать событие своим собственным потоком кажется неправильным, однако это заставляет мое приложение работать намного быстрее. Есть указатели?