【发布时间】: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