在运行时改变计时器c#

时间:2017-12-09 22:02:21

标签: c# wpf timer dispatchertimer

我使用调度时间创建了一个计时器:

time = new DispatcherTimer();
time.Interval = new TimeSpan(0, 0, 0, 0, 80);

我将它用于对象的速度。每个对象移动10个像素。 我想知道如何在不改变每个刻度移动的像素的情况下提高对象的速度,这意味着我想在每10秒左右的运行时间内使计时器本身更快。 有没有办法可以做到这一点?我已经尝试过变速= 0并且每增加一次就增加它然后

time.Interval = new TimeSpan(0, 0, 0, 0, 80-speed); 

但对象保持相同的速度。所以我必须制作自己的计时器类而不是使用内置的调度程序时间,如果是这样我该怎么做?还是有其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

我认为DispatcherTimer不是你完成这项任务的最佳盟友。该类绝不是为了以精确的间隔执行动作而设计的。

我会尝试更好地解释自己:即使DispatcherTimer,正如其名称所暗示的那样,及时且高精度地调度操作,调度的操作将排队,然后在基础{时执行{ {1}}线程决定处理它们。

通常情况下,GUI主题的分辨率约为GUI(这是一个近似值,但我认为我们现在无需对其进行测量)...并且您正在使用8ms的{​​{1}},它会随着时间的推移而减少,直到它可能超出Interval左右的容差限制。同时,你也在反复重新绘制你的界面(或部分界面),这会对80ms的性能和响应性产生更大的影响:如果8ms线程忙于重新绘制,那么需要超过GUI值才能完成,只有GUI线程完成正在进行的任务后,才会处理下一个调度的操作。

如果您需要更精确的计划,避免响应/延迟操作的挂起/丢失,您需要使用在Interval等背景下运行的计时器类(google for GUI,这将是有用)或System.Threading.Timer

最重要的是,在显示速度变化时,永远不要间隔播放。以固定间隔工作并增加/减少运动"尺寸"像素。您应该能够毫无问题地计算增量。只是为了让事情变得更清楚:如果我想减慢一个物体的速度加倍,我不会在绘制物体的定时器间隔的一半时间,但是我将物体在每一步穿过的像素数量增加一倍