Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Silverlight/XNA动画_C#_Silverlight_Windows Phone 7_Xna - Fatal编程技术网

C# Silverlight/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框架:(所有工作

当我使用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;