WPF DoubleAnimationUsingKeyFrames跳过帧

时间:2018-10-12 20:12:38

标签: c# wpf animation

我正在尝试使用DoubleAnimationUsingKeyFramesDiscreteDoubleKeyFrame为每个关键帧的滑块设置动画效果。但是,播放情节提要时似乎正在跳过帧,也就是说,并不是每个关键帧都触发ValueChanged事件。故事板和动画的代码设置如下:

DoubleAnimationUsingKeyFrames _timelineAnimation = new DoubleAnimationUsingKeyFrames();
Storyboard _timelineStoryboard = new Storyboard();

void SetupTimeline()
{
    // set up timeline storyboard animation
    _timelineAnimation.SpeedRatio = 1.0;
    Storyboard.SetTarget(_timelineAnimation, timelineSlider);
    Storyboard.SetTargetProperty(_timelineAnimation, new PropertyPath(Slider.ValueProperty));
    _timelineStoryboard.Children.Add(_timelineAnimation);
    timelineSlider.ValueChanged += TimelineSlider_ValueChanged;
}

void StartTimeline(List<double> times)
{
    foreach (double time in times)
    {
        double value = time - timelineSlider.Value;
        var keyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(value));

        _timelineAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(time, keyTime));
    }

    _timelineStoryboard.Begin(timelineSlider, true);
}

// this does not fire for every key frame
void TimelineSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    Debug.Print($"TimelineSlider_ValueChanged {e.NewValue}");
}

示例输入数据(以秒为单位):

136.224
136.238 
136.244 
136.2441
136.246
136.2461
136.264 
136.274 
136.294 
136.2941
136.296 
136.2961

我认为问题可能出在数据项之间距离太近。有什么方法可以加快动画计时器的分辨率吗?或有关解决方案的其他建议?

1 个答案:

答案 0 :(得分:1)

实际上,当两帧之间的间隔设置为小于30毫秒左右时,可能会跳过某些帧。

这很像WPF DispatcherTimer。无论WPF Interval有多小,WPF DispatcherTimer每30毫秒(约30毫秒)仅滴答一次。

为了产生动画效果,WPF使用time manager定期发出更新信号。勾选时,将重新评估动画属性(在本例中为Value的{​​{1}}属性),并且更新了UI。显然,它会选择时间轴中的“最近”帧,并丢弃那些已经过时的帧。

  

时间管理器每秒“滴答”多次;每秒发生的滴答声的实际数量取决于可用的系统资源。

即使您设法加快分辨率计时器的速度-我想UI计时器也不可能,例如,使其每1毫秒滴答一次,人眼也无法感知动画中如此高的频率,并且,监视器的显示频率仅为50-60 Hz。