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; }
谢谢!
安德烈
要设置MaxFrameRate:
Application.Current.Host.Settings.MaxFrameRate = 60;
这将使您的应用程序限制为每秒60帧,这应该足够了.
总结以上是内存溢出为你收集整理的Silverlight动画不流畅全部内容,希望文章能够帮你解决Silverlight动画不流畅所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)