移动许多Canvas对象的有效方法

时间:2012-11-14 21:02:47

标签: c# wpf canvas shape

下面的代码从物理引擎获取对象的所有位置和角度,并相应地更新每个对象。一旦对象之间存在大量活动,它就会变慢。

我知道它是 NOT 物理引擎,因为我使用OpenGL编写完全相同的东西,但我不能将它用于我的特定应用程序。

int bodyId = 0;
foreach (Shape shape in shapes)
{
    //Don't update sleeping objects because they are sleeping.
    //Waking them up would be terrible...
    //IGNORE THEM AT ALL COSTS!!
    if (physics.IsSleeping(bodyId))
    {
        ++bodyId;
        continue;
    }

    //Rotate transform
    RotateTransform rot = new RotateTransform(physics.GetAngle(bodyId));
    rot.CenterX = shape.Width / 2;
    rot.CenterY = shape.Height / 2;

    //Set the shape to rotate
    shape.RenderTransform = rot;

    //Body position
    Point bodyPos = physics.GetPosition(bodyId);
    Canvas.SetLeft(shape, bodyPos.X - shape.Width / 2);
    Canvas.SetTop(shape, bodyPos.Y - shape.Height / 2);

    ++bodyId;
}

我想知道是否有更有效的方法来完成上述工作,分解为几个问题。

  1. 如果我调用Canvas.SetLeft,Canvas.SetTop是否有时间UI将在循环内开始渲染?或者,如果不清楚,Canvas.SetLeft和Canvas.SetTop函数究竟是如何工作的?

  2. 因为我已经在使用RotateTransform,所以使用TranslateTransform会更好吗?

1 个答案:

答案 0 :(得分:1)

  1. 是的,每次为您拥有的每个元素调用SetTop()和SetLeft()。如果你想让一切更有效率,我会做以下事情。首先使用更新逻辑的更新函数,即计算对象的位置,然后通过循环遍历对象来处理绘图,只使用setLeft()和setTop()一次而不是每次更新。
  2. 是的,它会为您节省一次操作。
  3. 也许还有其他可以优化的东西。与使用像CPU密集型的RotateTransform()这样的矩阵运算不同,您可以通过在形状对象中保存当前旋转状态来节省大量计算能力。使用矢量也可能有助于提高性能。