C# WPF应用程序非常慢-Kinect SDK 1.7

C# WPF应用程序非常慢-Kinect SDK 1.7,c#,wpf,visual-studio-2012,kinect,lag,C#,Wpf,Visual Studio 2012,Kinect,Lag,我有一个简单的Kinect应用程序,但它似乎消耗了很多资源。它正常工作1-2分钟,然后滞后变得难以忍受 这是我的配置: Intel Core i3 CPU M330 2.13 GHz 4 GB内存 ATI Radeon HD 4570 这是应用程序窗口的代码: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Loaded

我有一个简单的Kinect应用程序,但它似乎消耗了很多资源。它正常工作1-2分钟,然后滞后变得难以忍受

这是我的配置:

Intel Core i3 CPU M330 2.13 GHz

4 GB内存

ATI Radeon HD 4570

这是应用程序窗口的代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;

    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {

        this.WindowState = System.Windows.WindowState.Maximized;
    }

    private void StopKinect(KinectSensor sensor)
    {
        if (sensor != null)
        {
            if (sensor.IsRunning)
            {
                //stop sensor 
                sensor.Stop();

                //stop audio if not null
                if (sensor.AudioSource != null)
                {
                    sensor.AudioSource.Stop();
                }


            }
        }
    }

    private void Window_Closing_1(object sender, System.ComponentModel.CancelEventArgs e)
    {
        StopKinect(Generics.GlobalKinectSensorChooser.Kinect);
    }
}
这是主菜单(第一个屏幕)的代码:

屏幕1的代码如下:

public partial class Depth : Page
{
    #region "Kinect"
    private KinectSensorChooser sensorChooser;
    #endregion

    const float MaxDepthDistance = 4095; // max value returned
    const float MinDepthDistance = 850; // min value returned
    const float MaxDepthDistanceOffset = MaxDepthDistance - MinDepthDistance;

    public Depth()
    {

        this.InitializeComponent();
        // initialize the sensor chooser and UI
        this.sensorChooser = new KinectSensorChooser();
        //Assign the sensor chooser with the sensor chooser from the mainwindow. 
        //We are reusing the sensorchoosing declared in the first window that can in contact with kinect
        this.sensorChooser = Generics.GlobalKinectSensorChooser;
        //subscribe to the sensorChooserOnKinectChanged event
        this.sensorChooser.KinectChanged += SensorChooserOnKinectChanged;
        //Assign Kinect Sensorchooser to the sensorchooser we got from our static class
        this.sensorChooserUi.KinectSensorChooser = sensorChooser;
        // Bind the sensor chooser's current sensor to the KinectRegion
        var regionSensorBinding = new Binding("Kinect") { Source = this.sensorChooser };
        BindingOperations.SetBinding(this.kinectRegion, KinectRegion.KinectSensorProperty, regionSensorBinding);
    }

    private void SensorChooserOnKinectChanged(object sender, KinectChangedEventArgs args)
    {
        bool error = false;
        if (args.OldSensor != null)
        {
            try
            {
                args.OldSensor.DepthStream.Range = DepthRange.Default;
                args.OldSensor.SkeletonStream.EnableTrackingInNearRange = false;
                args.OldSensor.DepthStream.Disable();
                args.OldSensor.SkeletonStream.Disable();

                args.OldSensor.ColorStream.Disable();
            }
            catch (InvalidOperationException)
            {
                error = true;
            }
        }

        if (args.NewSensor != null)
        {
            try
            {
                args.NewSensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
                args.NewSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
                args.NewSensor.SkeletonStream.Enable();

            }
            catch (InvalidOperationException)
            {
                error = true;
            }
        }

        if (!error)
            kinectRegion.KinectSensor = args.NewSensor;
    }


    private void MenuButtonOnClick(object sender, RoutedEventArgs e)
    {
        //Unsubscribe to the sensorchooser's  event SensorChooseronkinectChanged
        this.sensorChooser.KinectChanged -= SensorChooserOnKinectChanged;
        (Application.Current.MainWindow.FindName("_mainFrame") as Frame).Source = new Uri("MainScreen.xaml", UriKind.Relative);
    }
}
还有几个屏幕,我选择了这个屏幕,我使用的是WpfViewers的KinectDepthViewer。此屏幕具有最严重的延迟,应用程序几乎立即无法使用。其他屏幕上只有按钮,开始时没有延迟,但使用2-3分钟后就会出现

我不知道我在初始化中是否做错了什么。我希望有人能给我一些建议。我读到人们在开发更弱的配置时没有问题,所以我希望不是因为这个


谢谢大家!

您的图形适配器表明您正在使用笔记本电脑。虽然您的代码中可能有一些地方可以改进,但我真的认为问题在于您的硬件。具有您列出的规格的笔记本电脑在运行与Kinect类似的CPU密集型设备时会遇到问题。

谢谢您的回答。我原以为可能是这样,但今天我在一台台式PC上测试了它,它有一个4核处理器。该配置上也会出现问题。在TaskManager中,我看到处理器一直接近100%。
public partial class Depth : Page
{
    #region "Kinect"
    private KinectSensorChooser sensorChooser;
    #endregion

    const float MaxDepthDistance = 4095; // max value returned
    const float MinDepthDistance = 850; // min value returned
    const float MaxDepthDistanceOffset = MaxDepthDistance - MinDepthDistance;

    public Depth()
    {

        this.InitializeComponent();
        // initialize the sensor chooser and UI
        this.sensorChooser = new KinectSensorChooser();
        //Assign the sensor chooser with the sensor chooser from the mainwindow. 
        //We are reusing the sensorchoosing declared in the first window that can in contact with kinect
        this.sensorChooser = Generics.GlobalKinectSensorChooser;
        //subscribe to the sensorChooserOnKinectChanged event
        this.sensorChooser.KinectChanged += SensorChooserOnKinectChanged;
        //Assign Kinect Sensorchooser to the sensorchooser we got from our static class
        this.sensorChooserUi.KinectSensorChooser = sensorChooser;
        // Bind the sensor chooser's current sensor to the KinectRegion
        var regionSensorBinding = new Binding("Kinect") { Source = this.sensorChooser };
        BindingOperations.SetBinding(this.kinectRegion, KinectRegion.KinectSensorProperty, regionSensorBinding);
    }

    private void SensorChooserOnKinectChanged(object sender, KinectChangedEventArgs args)
    {
        bool error = false;
        if (args.OldSensor != null)
        {
            try
            {
                args.OldSensor.DepthStream.Range = DepthRange.Default;
                args.OldSensor.SkeletonStream.EnableTrackingInNearRange = false;
                args.OldSensor.DepthStream.Disable();
                args.OldSensor.SkeletonStream.Disable();

                args.OldSensor.ColorStream.Disable();
            }
            catch (InvalidOperationException)
            {
                error = true;
            }
        }

        if (args.NewSensor != null)
        {
            try
            {
                args.NewSensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
                args.NewSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
                args.NewSensor.SkeletonStream.Enable();

            }
            catch (InvalidOperationException)
            {
                error = true;
            }
        }

        if (!error)
            kinectRegion.KinectSensor = args.NewSensor;
    }


    private void MenuButtonOnClick(object sender, RoutedEventArgs e)
    {
        //Unsubscribe to the sensorchooser's  event SensorChooseronkinectChanged
        this.sensorChooser.KinectChanged -= SensorChooserOnKinectChanged;
        (Application.Current.MainWindow.FindName("_mainFrame") as Frame).Source = new Uri("MainScreen.xaml", UriKind.Relative);
    }
}