Why is Frame Rate in WPF Irregular and Not Limited To Monitor Refresh?

后端 未结 3 1940
别跟我提以往
别跟我提以往 2020-12-02 23:48

I\'m measuring the time between frames in a simple WPF animation. Perforator says the app performs at ~60fps, so I expected the time between frames to be ~16.6ms with little

3条回答
  •  南方客
    南方客 (楼主)
    2020-12-03 00:04

    First - 'Christopher Bennage's-Answer has a good explanation and provides a hint to a solution:

    "Only do “per-frame” work when the reported frame time changes"

    This is a little bit hard, since the RenderingEventArgs are hidden as a normal EventArgs and a cast has to be done.

    To make this a little bit easyer, a convinient solution can be found in "EVAN'S CODE CLUNKERS" http://evanl.wordpress.com/2009/12/06/efficient-optimal-per-frame-eventing-in-wpf/

    I took his code and modified it a bit. Now just take my snipped, add the class to your Project, use CompositionTargetEx were you used CompositionTarget and you are fine :)

    public static class CompositionTargetEx { 
        private static TimeSpan _last = TimeSpan.Zero; 
        private static event EventHandler _FrameUpdating; 
        public static event EventHandler Rendering { 
            add { 
                if (_FrameUpdating == null)                 
                    CompositionTarget.Rendering += CompositionTarget_Rendering;
                _FrameUpdating += value; 
            } 
            remove { 
                _FrameUpdating -= value; 
                if (_FrameUpdating == null)                
                    CompositionTarget.Rendering -= CompositionTarget_Rendering; 
            } 
        } 
        static void CompositionTarget_Rendering(object sender, EventArgs e) { 
            RenderingEventArgs args = (RenderingEventArgs)e;
            if (args.RenderingTime == _last) 
                return;
            _last = args.RenderingTime; _FrameUpdating(sender, args); 
        } 
    }
    

提交回复
热议问题