0

在我的 Windows Phone 7 应用程序中有一个带有主Canvas控件的页面。它包含 5Image层,大小为 640x480 和一些透明度,一层堆叠在另一层之上。

开始时,应用程序读取来自加速度计的信息,并在每次 X;Y;Z 更新时将图像移动到不同的位置。

我使用Canvas.SetLeft(element, position)andCanvas.SetTop(element, position)方法分别移动每一层,如下所示:

void accelSensor_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
{
   accelReading.X = (float)e.SensorReading.Acceleration.X;
   accelReading.Y = (float)e.SensorReading.Acceleration.Y;
   accelReading.Z = (float)e.SensorReading.Acceleration.Z;

   /* do some math... */

   this.Dispatcher.BeginInvoke(delegate()
   {
      for (var i = 0; i < MainCanvas.Children.Count; i++)
      {
         Canvas.SetLeft(MainCanvas.Children[i], /* some value... */));
         Canvas.SetTop(MainCanvas.Children[i], /* some value... */));
      }
   });
}

问题是 GUI 的更新非常缓慢……对象每秒改变一次位置。我是否实施了错误的方法?在不丢失 FPS 的情况下经常移动图像的正确方法是什么?我真的需要切换到 XNA 吗?

4

1 回答 1

1

要检查 GPU 是否加速设置 Application.Current.Host.Settings.EnableCacheVisualization = true; 在 App.xaml.cs 中并检查整个屏幕是否未着色(表面未加速的硬件将被着色)。
您还可以通过设置 Application.Current.Host.Settings.EnableRedrawRegions = true; 来组合它。查看正在重绘的表面。
为了在代码(而不是故事板)中更改属性时获得硬件加速的好处,请确保在您移动的对象上设置 CacheMode="BitmapCache"。

于 2013-09-16T13:15:33.293 回答