Silverlight动画不流畅

Silverlight动画不流畅,第1张

概述当尝试基于Silverlight设置对象时间/帧的动画时(与使用DoubleAnimation或Storyboard不同的东西,例如不适合快节奏的游戏),例如每帧在特定方向上移动宇宙飞船,运动是跳跃的,不太顺利.屏幕甚至似乎都在撕裂. CompositionTarget和DistpatcherTimer之间似乎没有区别. 我使用以下方法(在伪代码中): Register Handler to Ti 当尝试基于Silverlight设置对象时间/帧的动画时(与使用DoubleAnimation或Storyboard不同的东西,例如不适合快节奏的游戏),例如每帧在特定方向上移动宇宙飞船,运动是跳跃的,不太顺利.屏幕甚至似乎都在撕裂.

CompositionTarget和distpatcherTimer之间似乎没有区别.
我使用以下方法(在伪代码中):

Register Handler to Tick-Event of a dispatcherTimerIn each Tick:Compute the elapsed time from the last frame in millisecondsObject.X += movementSpeed * ellapsedMilliseconds

这应该会导致运动平稳,对吧?但事实并非如此.
以下是一个示例(控件:WASD和鼠标):Silverlight Game.
虽然我所描述的效果在这个示例中并不太普遍,但我可以向您保证,即使在画布上移动单个矩形也会产生跳跃动画.

有人知道如何最小化这个.有没有其他方法可以使用Storyboards / DoubleAnimations来解决基于帧的动画问题?

编辑:这是一个快速而肮脏的方法,用最少的代码(控件:A和D)动画一个矩形Animation Sample

XAML:

<GrID x:name="LayoutRoot" Background="Black">    <Canvas WIDth="1000" Height="400" Background="Blue">        <Rectangle x:name="rect" WIDth="48" Height="48"                   Fill="White"                   Canvas.top="200"                   Canvas.left="0"/>    </Canvas></GrID>

C#:

private bool isleft = false;    private bool isRight = false;    private dispatcherTimer timer = new dispatcherTimer();    private double lastUpdate;    public Page()    {        InitializeComponent();        timer.Interval = TimeSpan.FromMilliseconds(1);        timer.Tick += OnTick;        lastUpdate = Environment.TickCount;        timer.Start();    }    private voID OnTick(object sender,EventArgs e)    {        double diff = Environment.TickCount - lastUpdate;        double x = Canvas.Getleft(rect);        if (isRight)            x += 1 * diff;        else if (isleft)            x -= 1 * diff;        Canvas.Setleft(rect,x);        lastUpdate = Environment.TickCount;    }    private voID UserControl_KeyDown(object sender,KeyEventArgs e)    {        if (e.Key == Key.D)            isRight = true;        if (e.Key == Key.A)            isleft = true;    }    private voID UserControl_KeyUp(object sender,KeyEventArgs e)    {        if (e.Key == Key.D)            isRight = false;        if (e.Key == Key.A)            isleft = false;    }

谢谢!
安德烈

解决方法 每1毫秒更新一次位置是过度的,因为silverlight不会快速更新屏幕.当您修改像这样的对象(或任何其他ui更新)的位置时,silverlight会将帧缓冲区标记为脏,然后它最终将重绘屏幕,但是它不会比MaxFrameRate更频繁地重绘屏幕.

要设置MaxFrameRate:

Application.Current.Host.Settings.MaxFrameRate = 60;

这将使您的应用程序限制为每秒60帧,这应该足够了.

总结

以上是内存溢出为你收集整理的Silverlight动画不流畅全部内容,希望文章能够帮你解决Silverlight动画不流畅所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1000923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存