C# Silverlight/XNA动画
当我使用XNA框架(用于windows Phone)时,我的游戏运行得非常好,但当我迁移到Silverlight/XNA框架时,我遇到了动画滞后的问题。 问题如下: 当我将固定时间步长设置为GameTimer(timer.UpdateInterval=TimeSpan.FromTicks(333333))时,实时步长不会固定,计时器事件(OnUpdate,OnDraw)会以不同的间隔触发。 此代码更清楚地显示了我的问题: Silverlight/XNA框架:(动画滞后): XNA框架:(所有工作正常): 改为C# Silverlight/XNA动画,c#,silverlight,windows-phone-7,xna,C#,Silverlight,Windows Phone 7,Xna,当我使用XNA框架(用于windows Phone)时,我的游戏运行得非常好,但当我迁移到Silverlight/XNA框架时,我遇到了动画滞后的问题。 问题如下: 当我将固定时间步长设置为GameTimer(timer.UpdateInterval=TimeSpan.FromTicks(333333))时,实时步长不会固定,计时器事件(OnUpdate,OnDraw)会以不同的间隔触发。 此代码更清楚地显示了我的问题: Silverlight/XNA框架:(动画滞后): XNA框架:(所有工作
TimeSpan.Zero;
是的,我知道这感觉很奇怪,非常奇怪。从某个官方游戏指南那里得到的。除非我使用它,否则我的游戏会非常落后。基于视频游戏行业多年的经验:你不应该在Silverlight/XNA/Mobile中以固定帧速率制作动画
如果可能的话,将你的应用程序改为只在游戏时间内运行,而不是在假定的固定帧速率下运行(你永远不会在移动设备上运行,至少在它们变得更强大之前是如此)
XNA游戏方法需要GameTime
的原因是你不能依赖帧速率。。。永远
不要和市政厅打架。。。遵守标准。使你的应用程序尽可能快(例如,如果你的动画在一帧中跳得太远),或者降低你的动画速度以适应平台(例如,降低游戏/应用程序的速度)
注意:Silverlight动画通常比Flash动画看起来更平滑的原因是,所有内容都是基于时间和插值的,而不是固定帧。Thx。TargetReleasedTime在XNA框架中使用,游戏在其中完美运行。Silverlight/XNA框架中的问题(timer.UpdateInterval=TimeSpan.FromTicks(333333))。如果我将timer.UpdateInterval设置为TimeSpan.Zero,那么OnUpdate方法将在一个可变的时间步长上调用,但我需要REAL fixed time step.Thx作为应答。我发现了我的错误:我使用基于固定帧速率的动画,并通过帧索引以更新方法计算动画。现在,我将通过绘制方法中的实时运行时间来计算动画。非常感谢。
TimeSpan curNow;
TimeSpan lastUpdate;
TimeSpan lastDraw;
public Game()
{
// Frame rate is 30 fps by default for Windows Phone.
TargetElapsedTime = TimeSpan.FromTicks(333333);
}
protected override void Update(GameTime gameTime)
{
curNow = new TimeSpan(DateTime.Now.Ticks);
TimeSpan elapsed=gameTime.ElapsedGameTime;//Always constant and has value: 33ms
TimeSpan realElapsed = curNow - lastUpdate;//Real elapsed time has a value between: 34-35ms (sometimes more then 35ms)
lastUpdate = curNow;
}
protected override void Draw(GameTime gameTime)
{
curNow = new TimeSpan(DateTime.Now.Ticks);
TimeSpan elapsed=gameTime.ElapsedGameTime ;//Value between: 33-34ms (sometimes more then 34ms)
TimeSpan realElapsed = curNow - lastDraw;//Value between: 34-35ms (sometimes more then 35ms)
lastDraw = curNow;
}
TimeSpan.Zero;