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