0

/私は次のもので構築されたコンピュータで作業し、テストしています: {1 GB RAM (現在は 1.5 GB)、1.7 GHz Intel Pentium プロセッサ、ATI Mobility Radeon X600 GFX}

スケール/トランスフォーム コントロールが必要で、スムーズに流れるようにします。現在、24 ~ 33 ミリ秒 (30 fps)、±3 ピクセルごとにコントロールのサイズと位置を操作しています。画像に「フェード」効果を追加すると、スムーズにフェードインおよびフェードアウトしますが、サイズは 25x25 ピクセルしかありません。コントロールのサイズは 450x75 ピクセルから 450x250 ピクセルです。Bejeweled 3 などの 2D ゲームでは、スプライトは途切れることなくアニメーションします。

タイトルが示唆するように: プロセッサ上でどちらが簡単/高速ですか: ビットマップをアニメーション化する (アニメーション中に親コントロールにレンダリングする) か、それ自体のコントロールをアニメーション化しますか?

編集: ねえ、これは役に立つコミュニティだと思いました。難しいとは思えない質問を低く評価するコミュニティではありません! (そして、もっとばかげた質問で、より良い評価も見ました!) 私の質問を否定的に評価する前に、まず私に連絡してください!

4

1 に答える 1

1

私は、新しいプロジェクトをすばやく準備するために、スケジュールされたヘックティックで自由時間を見つけることができました。私の時間は他の場所でもっとよく過ごしたかもしれないと確信していますが、うまくいけば、私の靴を履いた他の誰かがこれをそこに使うことができるかもしれません...

答えは次のとおりです。コントロール上の画像。ビットマップをキャンバスにレンダリングする場合、発生するイベントはほとんどありません。コントロールに関しては、イベントでいっぱいです-いくつかは連鎖、いくつかはループ、そして再帰の追加です、それで単純な「LocationChanged」イベントは実際に内部で起こっていることの半分さえカバーしません。

実行時に多くの動的アニメーションが適用されるコントロールに対して私が行うことは、2つのピースセットを開発することです。コントロール[レンダリング]テンプレートまたはアクティブインターフェイス(コントロールが停止しているときまたは再生前の場合)アニメーションの)、および表示画像[レンダリングされたコントロール]、長方形の境界、および後で適用される可能性のあるアニメーションアルゴリズムなどの基本的な定義プロパティを備えたアニメーション構造。

編集:要求に応じて、前後のコード例を次に示します。

// This is the triggering event of the translating animation
private void object_Click(object sender, EventArgs e)
{
      // the starting point is at (75,75)
      element.Transform(new Point(500, 250));
}

前:

public class ControlElement : UserControl
{
      private Timer tick;
      private Point pT0;
      public ControlElement() : base()
      {
            tick = new Timer();
            tick.Interval = 30; // about 30fps
            tick.Tick += new EventHandler(tick_Tick);
      }
      void tick_Tick(object sender, EventArgs e)
      {
            // get the new point from distance and current location/destination
            this.Location = Utils.Transform(this.Location, pT0, 3);
            if ((pT0.X - this.Location.X)+(pT0.Y - this.Location.Y) <= 0)
            {
                this.Location = pT0;
                tick.Stop();
                //this.Visible = true;
            }
      }
      public void Transform(Point destination)
      {
            pT0 = destination;
            //this.Visible = false;
            tick.Start();
      }
}

変更後:機能を使用してコントロールがどのように表示されるかを示すクラスを作成しDrawToBitmapます。上記と同じアニメーションメソッドがまだ含まれています。このクラスはコントロールではなくなったため、要素Locationと要素を追加する必要がありました。LocationChanged実際のコントロールにアクセスする必要がある場合は、レンダリングを停止して、コントロール自体のインスタンスを表示します。
レンダリング呼び出しは次のとおりです。

void element_LocationChanged(object sender, EventArgs e)
{
      canvas.Invalidate();
}
void canvas_Paint(object sender, PaintEventArgs e)
{
      if (element != null)
      {
            Bitmap bmp = new Bitmap(element.Display);
            Pen p = new Pen(Color.FromArgb(128, 128, 128), 1);
            e.Graphics.DrawImage(bmp, element.Location);
            e.Graphics.DrawRectangle(p, 
                 element.Location.X, element.Location.Y, 
                 bmp.Width, bmp.Height);
      }
}
于 2012-10-18T00:58:29.980 に答える