【问题标题】:Inconsistent Storyboard performance in emulator模拟器中的故事板性能不一致
【发布时间】: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


【解决方案1】:

我 90% 确定它是由模拟器引起的,但请注意 10 毫秒是非常短的间隔。 Silverlight 应用程序每秒刷新 60 次,因此为 16.6 毫秒。我建议您将其设置为 33 毫秒或更长。

在我的一个游戏中,我使用了 DispatcherTimer,它工作得很好(对于落下的炸弹 :))但并不像我想象的那么准确。使用故事板作为计时器是更好的 IMO。基本上,如果您没有任何其他复杂的动画,合成器线程可以顺利运行,并且您的计时器非常准确。

作为拥有设备来测试您的代码(或购买)的人。

【讨论】:

  • 我也认为 10 毫秒太短了,但即使将情节提要持续时间设置为 100 毫秒,我也会得到 ~90..110 的周期,偶尔会有 195-200+。这些才是真正的问题(微小的变化太小以至于无法察觉)。无论如何,我会尽快得到一个设备,因为它真的闻起来像一个仿真器神器(如果有人可以在设备上测试上面的代码,那就太棒了)
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2013-09-28
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
相关资源
最近更新 更多