在 XAML 画布控件上移动层:性能缓慢

本文关键字:移动 缓慢 性能 控件 XAML 布控件 | 更新日期: 2023-09-27 18:31:29

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

开始时,应用程序读取来自加速度计的信息,并在每个 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 吗?

在 XAML 画布控件上移动层:性能缓慢

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