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