我正在对Silverlight WP7游戏进行性能调整,并且我在模拟器中运行时观察到一种奇怪的行为(我没有真正的设备,所以我不知道它是否是模拟器工件)。
我使用Storyboard作为主游戏循环计时器,我在Completed事件中更新渲染,然后重新启动动画。问题是,Completed事件以非常不同的间隔触发。
我在一个非常简单的函数中隔离了这个问题,需要ex。按下按钮(我把它放在一个完全空的应用程序中,应用程序中没有没有其他)。
var sw = new Stopwatch();
var animation = new Storyboard();
animation.Duration = TimeSpan.FromMilliseconds(10);
animation.Completed += (s, e) =>
{
sw.Stop();
Debug.WriteLine(sw.ElapsedMilliseconds.ToString());
sw.Reset();
sw.Start();
animation.Begin();
};
animation.Begin();
我期望(理想情况下)的输出类似于
10
10
10
10
...
但相反,这就是我得到的:
12
15
16
17
17
14
10
10
10
9
11
132
10
20
11
11
10
12
周期之间的时间差异很大,但最重要的是偶尔有很长的延迟(如上面的132)。无论动画持续时间如何,都会发生这种情况,即实际持续时间在设定的持续时间内“居中”,但随着间歇性的长时间延迟而变化很大。
你可以想象我的游戏运行非常不规则,根本不是光滑和均匀的。另外我注意到无论渲染操作有多简单,我都不能超过~42 FPS。
问题1 :我做了一些明显且明显的错误吗?我的方法有缺陷吗?
问题2 :为什么故事板的持续时间在运行之间如此不一致?
答案 0 :(得分:2)
我90%肯定是由模拟器引起的,但要注意10ms是非常短的间隔。 Silverlight应用程序每秒刷新60次,因此它是16,6ms。我建议你把它设置为33毫秒或更长。
在我的一个游戏中,我使用DispatcherTimer工作正常(对于坠落的炸弹:))但不像我想的那么准确。使用故事板作为计时器是更好的IMO。基本上,如果你没有任何其他复杂的动画,合成器线程工作顺利,你的计时器非常准确。
有人使用设备测试您的代码(或购买代码)。