Fusion Frame Rate RRS feed

  • Question

  • Hi,

    I am running the Kinect Fusion Explorer sample from the SDK and I am experiencing frame rates or around 16 FPS. I believe that with my machine specifications I should be getting much better performance.

    Can anyone suggest ways to troubleshoot and work to better performance?

    • Intel i7 3700K CPU (3.5 GHz x 4)
    • 16GB RAM
    • NVidia GTX 660 TI Graphics


    Monday, May 20, 2013 1:38 PM


All replies

  • Are you using Kinect for Windows sensor? What class of system are you running mobile or desktop?
    Note: It is possible to use Kinect Fusion on laptop class DirectX11 GPU hardware, but this typically runs significantly slower than desktop-class hardware.

    The speed is going to be limited to the slowest component. What is your framerate for the Depth samples from the SDK? What type of USB host controller do you have and is that shared with other devices? What is the current system utilization and performance like at the time you are capturing? How much graphics memory do you have? What is the speed of the memory? Are you running the latest drivers for the GPU?

    Tuesday, May 21, 2013 10:02 PM
  • Yes, I am using a Kinect for Windows sensor on desktop class hardware.

    • Intel i7 3700K CPU (3.5 GHz x 4)
    • 16GB RAM
    • NVidia GTX 660 TI Graphics with 2048MB GDDR5 dedicated memory running at 6008MHz with the latest drivers.

    The Kinect is connected directly to the USB ports on the motherboard. I have tried with both USB 2.0 and USB 3.0 controllers with no other devices on the controllers.

    When the Kinect Fusion Explorer sample is running, I am using ~30% CPU and ~40% memory.

    How can I tell what the frame rate is on the Depth samples. I've tried on DepthBasics-WPF and cannot see it anywhere.


    Wednesday, May 22, 2013 10:02 AM
  • Try the Kinect Explorer sample, this will show the frame rate for depth. As long as that is giving you 30fps, then you can rule out anything in the Kinect pipeline. As for the Fusion sample are you using Kinect Fusion Explorer-D2D? The specs of your machine, you should be getting close to full-frame rate with this sample.

    Are you running Windows 7? If so, can you make sure you have full Aero turned on by enabling one of the full themes.

    Thursday, May 23, 2013 12:24 AM
  • Ok, in the Kinect Explorer I get a full 30FPS from the Depth Sensor. I am running Windows 8 so as far as I know there is no Aero to enable.

    I was using the Kinect Fusion Explorer - WPF. I tried it on the D2D and I get just under 30 FPS.

    What can I do to ensure that I get the same performance in WPF?

    Thursday, May 23, 2013 10:02 AM
  • If you need performance you will need to stay with native c++. The managed Interop layer is going to introduce latency which will affect performance, as you have experienced.

    You have to balance performance vs rapid development.

    Thursday, May 23, 2013 5:04 PM
  • Is this "feature" of Kinect Fusion documented?

    As far as I can see, the Kinect Fusion documentation only specifies hardware requirements in order to get interactive performance. Not that you need to develop in native code.

    Thursday, May 23, 2013 7:11 PM
  • The samples are provided to demonstrate features and the SDK API's. They are a starting point and as such, there are areas of improvement that can be made. The amount of processing required to get the Fusion data ready and drawn on the UI has to happen in less than 1/30th of a second(33.3333ms.) As such, you can tweak the values and features required, as demonstrated between Kinect Fusion Basics-WPF and Kinect Fusion Explorer-WPF. Using a higher-end GPU like the 680 we saw framerates between 24-22fps, still not 30fps.

    The complexity of the area you are capturing will factor in as well. There is a tips and multi-threading sections in the docs

    Threading logic between what Fusion is doing and your drawing code is key. A code change you may want to try is the Calculate/Shade-PointCloud logic. This is done every frame. You don't have to draw this every frame and by adding logic on when to do this will give you the balance between redraw and performance. 

    private void ProcessDepthData(DepthImagePixel[] depthPixels) {

    ... // // add logic here to only draw when required // { // Calculate the point cloud this.volume.CalculatePointCloud(this.pointCloudBuffer, this.worldToCameraTransform); // Shade point cloud and render FusionDepthProcessor.ShadePointCloud( this.pointCloudBuffer, this.worldToCameraTransform, this.shadedSurfaceColorFrame, null); }

    ... }

    If you are willing there are general .Net performance tips that can be made if your comfortable with going this lower level.
    - Chapter 7

    Thursday, May 23, 2013 8:18 PM
  • OK, thanks. I'll look into these.

    Can you check the last link, it seems to be a duplicate of the first?

    Friday, May 24, 2013 8:27 AM
  • Sorry about that, updated the link now
    Friday, May 24, 2013 4:40 PM