WPF中DoubleAnimation引发过多DependencyProperty回调的优化咨询
如何减少WPF DoubleAnimation触发PropertyChangedCallback的次数?
你当前遇到的回调次数和DesiredFrameRate设置直接相关——这个属性控制的就是WPF动画每秒计算并更新目标属性的次数,所以设为8时每秒触发8次回调是正常的,和动画的时长参数无关。
完全可以进一步减少回调次数,这不是.NET的固定机制,给你两个可行方案:
方案1:针对性降低单个动画的帧率
不要全局重写Timeline的默认帧率(会影响所有动画),直接给你的flashAnimation单独设置更低的DesiredFrameRate,比如设为4,这样回调就会每秒触发4次:
flashAnimation = new DoubleAnimation(1, 0.3, TimeSpan.FromMilliseconds(330), FillBehavior.Stop) { RepeatBehavior = RepeatBehavior.Forever, AutoReverse = true, DesiredFrameRate = 4 // 单独设置这个动画的帧率 };
方案2:改用离散动画(最适合高亮场景)
因为你的需求只是高亮效果,不需要平滑的透明度过渡,完全可以用离散动画代替DoubleAnimation。离散动画不会在值之间插值,只会在指定的关键时间点直接切换属性值,回调次数完全由你定义的切换频率决定,CPU消耗极低。
示例代码:
var flashAnimation = new DoubleAnimationUsingKeyFrames { RepeatBehavior = RepeatBehavior.Forever, Duration = TimeSpan.FromSeconds(2) // 2秒完成一次"亮→暗→亮"循环 }; // 初始为高亮状态(透明度1) flashAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)))); // 1秒后切换到暗状态(透明度0.3) flashAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(0.3, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)))); // 2秒后切回高亮,因为RepeatBehavior是Forever,会循环执行 flashAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2)))); this.BeginAnimation(FlashOpacityProperty, flashAnimation);
上面的代码会每秒触发1次回调(每1秒切换一次透明度),完全满足高亮需求,几乎不会占用CPU。
内容的提问来源于stack exchange,提问作者korbif
相关产品推荐
相关产品推荐

