【发布时间】:2010-11-08 20:25:30
【问题描述】:
我正在对 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:为什么故事板的持续时间在运行之间如此不一致?
【问题讨论】:
-
两个想法: 1) 查看正在运行的其他代码可能会消耗周期,因为这会干扰情节提要动画。 2) 在上线之前获取物理 WP7 设备 - 否则您将无法真正了解您的应用程序性能如何。
-
约1):有/no/其他代码。该应用程序只有一个按钮,单击即可执行上述功能。没有别的了。
-
我假设您的 PC 上运行着其他软件并托管了模拟器。这可能会导致进程/线程延迟。无法保证计时器/持续时间将完全采用指定的毫秒数
-
我在我的设备上测试了这段代码——我得到了与模拟器显示的相似的差异。我不知道为什么,但我认为问题不在于模拟器。
-
@JP Alioto:感谢您抽出宝贵时间进行测试!您是否也得到了小的差异和大的偶尔“尖峰”?
标签: c# .net silverlight windows-phone-7