【问题标题】:Moving layers on a XAML Canvas control: slow performances在 XAML 画布控件上移动层:性能缓慢
【发布时间】:2013-09-16 08:44:59
【问题描述】:

在我的 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 吗?

【问题讨论】:

  • 您尝试过使用 TranslateTransform 吗?我认为变换是由 GPU 执行的。
  • 我会试一试的。所以我只需要改变告诉图层如何移动的方式,但它们总是在画布中?
  • 坏消息:我尝试使用 TranslateTransform 得到非常相似的结果。此外,我尝试将所有图层堆叠在 Grid 而不是 Canvas 中,同样缓慢的动作。
  • 首先,您能否在我们确定使用 GPU 加速的情况下测试性能?删除加速器阅读,并通过使用带有翻译转换的故事板使您的图层以预定义的方式移动(不要手动更改翻译转换的属性,让故事板处理所有事情)
  • 我很确定这不是加速度计的错。还有一种方法可以在用户点击 Canvas 时重置图层的位置。在这里,与加速度计无关,但层也会在一段时间后移动到“0;0”位置。

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


【解决方案1】:

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

【讨论】:

  • 它工作!将 EnableCacheVisualization 设置为 true 会在整个 Canvas 上显示一个蓝色图层,而在控件上设置 CacheMode="BitmapCache" 会产生更快的渲染!救世主徽章给你。
猜你喜欢
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2015-04-16
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多