1

以下のコードは、物理エンジンからオブジェクトのすべての位置と角度を取得し、それに応じて各オブジェクトを更新します。オブジェクト間に多くのアクティビティがあると、速度が低下します。

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を使用する方がよいでしょうか?

4

1 に答える 1

1
  1. はい、SetTop()とSetLeft()は、所有するすべての要素に対して毎回呼び出されます。すべてをより効率的にしたい場合は、次のようにします。最初にロジックを更新する更新関数を使用します。つまり、オブジェクトの位置を計算し、その後、オブジェクトをループするだけで描画を処理し、更新のたびにsetLeft()とsetTop()を1回だけ使用します。
  2. はい、1回の操作で節約できます。

たぶん、最適化できる何か他のものがあります。CPUを非常に集中的に使用するRotateTransform()のような行列演算を使用する代わりに、シェイプオブジェクトに現在の回転ステータスを保存することで、多くの計算能力を節約できます。また、ベクトルを使用すると、パフォーマンスの向上に役立つ可能性があります。

于 2012-11-14T21:08:45.497 に答える