在XAML Canvas控件上移动图层:性能降低

时间:2013-09-16 08:45:00

标签: c# performance xaml windows-phone-7 canvas

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

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

我使用Canvas.SetLeft(element, position)Canvas.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吗?

1 个答案:

答案 0 :(得分:1)

要检查GPU是否已加密,请设置Application.Current.Host.Settings.EnableCacheVisualization = true;在App.xaml.cs中检查整个屏幕是否有彩色(表面没有硬件加密会被着色)。
您可以通过设置Application.Current.Host.Settings.EnableRedrawRegions = true来组合它;看看正在重绘的表面。
要在代码中更改属性(而不是在storyboard中)时获得硬件通知的好处,请确保在您移动的对象上设置CacheMode =“BitmapCache”。