locked
Choppy frame rate in DirectX/XAML application using SwapChainBackgroundPanel

    Question

  • Hello everybody. I am developing graphics app using DirectX & XAML (SwapChainBackgroundPanel type of interaction). I activated frame rate counter in XAML apps using this article and noticed strange thing. When I do nothing in my application the composition thread frame rate equals 0 and 3d model (simple sphere) is rendered with choppy frame rate. However, when I start to trigger Application Bar on and off composition thread frame rate becomes equal 46-49 and everything are rendered smoothly. How can I lock composition thread frame rate at 60 fps no matter if I interact with XAML UI or not?
    Wednesday, August 08, 2012 2:05 PM

Answers

  • It should be okay to call Present() inside of CompositionTarget::Rendering as long as you aren't doing too much processing on the UI thread.  Another option is to start your own thread and present from that.

    Are you able to test this outside VirtualBox so that hardware acceleration is enabled?  It may be related to your drivers in some way.  According to this: https://www.virtualbox.org/wiki/Guest_OSes

    Windows 8 may not be fully supported yet.

    • Marked as answer by RenGate Thursday, August 09, 2012 5:50 PM
    Thursday, August 09, 2012 3:51 PM

All replies

  • The built in frame rate counter only works for the XAML UI content. It can't display the frame rate of any custom DirectX content you're drawing in a SwapChainBackgroundPanel - you would have to write your own custom frame rate counter for that (as you would in any DX app) since your app fully controls the swap chain's presentation timing.

    In this case if the composition thread frame rate is showing 0, that likely means the XAML framework isn't producing any new content (because it doesn't have to if you're not updating any of the XAML UI - which helps perf and battery life).  When you show the AppBar that means XAML content is updating on screen, so the XAML frame rate will update during that period.

     

    Wednesday, August 08, 2012 6:02 PM
  • Thank you for reply, but can you provide information why 3d objects are rendered with higher frame rate when XAML content is updating? My investigation showed that this occurs when XAML UI is rendered without full H/W acceleration (in Virtual Box environment in my case).

    Wednesday, August 08, 2012 7:08 PM
  • When are you calling Present() on your swap chain?  Your app is responsible for the frame timing of all SwapChainBackgroundPanel content, so the XAML UI shouldn't have any direct effect on it.  The behavior you're seeing could occur if you're relying on XAML events to call Present() though.

    If you're able to share a minimal app to reproduce the issue (e.g. via SkyDrive) I can take a look.

    Wednesday, August 08, 2012 7:46 PM
  • I call Present() inside of CompositionTarget::Rendering event handler. Here I uploaded video which illustrates my words. I have used external camera in order to not affect program performance by the software screen capture solutions so sorry for bad video quality. As you can see from provided video, when I trigger the AppBar (00:04 - 00:23) the sphere is rendered with higher fps then when I don`t. I start to think that difference if fps exists because I call Present() inside of CompositionTarget::Rendering event handler. Am I right about it? If so, where I can call Present() except CompositionTarget::Rendering event handler?
    Wednesday, August 08, 2012 8:00 PM
  • It should be okay to call Present() inside of CompositionTarget::Rendering as long as you aren't doing too much processing on the UI thread.  Another option is to start your own thread and present from that.

    Are you able to test this outside VirtualBox so that hardware acceleration is enabled?  It may be related to your drivers in some way.  According to this: https://www.virtualbox.org/wiki/Guest_OSes

    Windows 8 may not be fully supported yet.

    • Marked as answer by RenGate Thursday, August 09, 2012 5:50 PM
    Thursday, August 09, 2012 3:51 PM
  • On real hardware (i5 2410M & GeForce GT540M) all work well, I get hight frame rate no matter if I interact with the UI. So if calling Present() from CompositionTarget::Rendering is ok than this is a problem related to the Virtual Box. Thank you for help.

    Thursday, August 09, 2012 5:50 PM