首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使DispatcherTimer事件在WPF中更加平滑?

如何使DispatcherTimer事件在WPF中更加平滑?
EN

Stack Overflow用户
提问于 2013-01-16 09:02:45
回答 1查看 14.8K关注 0票数 11

在我的WPF应用程序中,用户按下一个按钮来平稳地启动3D模型,然后松开按钮停止旋转。

为此,我创建了一个DispatcherTimer:

代码语言:javascript
复制
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += new EventHandler( timer_Tick );
timer.Interval = new TimeSpan( 0, 0, 0, 0, 30 );

当按下按钮时,我调用timer.Start(),当按钮松开时,我调用timer.Stop()

timer_Tick函数改变了模型的旋转:

代码语言:javascript
复制
    void timer_Tick( object sender, EventArgs e )
    {
        spin = ( spin + 2 ) % 360;
        AxisAngleRotation3D rotation = new AxisAngleRotation3D( new Vector3D( 0, 1, 0 ), spin );
        Transform3D rotate = new RotateTransform3D( rotation );
        model2.Transform = rotate;
    }

我注意到的是,模型在大多数情况下旋转平稳,但经常结冰和口吃,停顿不同的时间,有时长达1/4秒。

有什么办法让这件事更顺利吗?我理解,通过使用DispatcherTimer (相对于System.Timers.Timer),回调发生在UI线程上。但我有必要加入UI威胁才能运行

代码语言:javascript
复制
        model2.Transform = rotate;

我读过关于在其他线程上获得计时器回调的各种方法。但似乎最后我必须与UI线程同步才能调用该行。如果我使用Invoke()来封送System.Timers.Timer回调线程到UI线程,这会给整个动画带来更流畅的效果吗?似乎不应该这样做,因为它必须与UI线程同步,就像DispatcherTimer所做的那样。就这一点而言,似乎任何将model2.Transform设置为一个规则间隔的方案对于UI线程来说都是在同一条船上,不是吗?

(作为一个次要的问题,我首先想弄清楚是什么导致了停顿。据我所知,UI线程没有做任何其他重要的事情。所以我不明白停下来的时候发生了什么。垃圾收集?它似乎不应该有很多垃圾收集,它似乎不会是如此极端的暂停。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-16 09:37:51

设置一个优先级。默认的是Background,这可能解释您所看到的口吃。我认为Render是你想要的水平,但做实验。

代码语言:javascript
复制
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Render);

如果这还不够顺利,你可以尝试把它设置为动画。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14354561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档