0

私のプログラムには、ビットマップを含む画像ボックスがあります。 (300x300 35kB .PNG ファイル)

2 つの変数 (x/z 座標) が変更された場合、それに応じて新しい位置に新しい円を毎秒描画します。タイマーがバックグラウンドで実行され、このメソッドが呼び出されます。

void DrawEllipse()
{       
  // Retrieve the image.
  bChamber = new Bitmap(global::Project.Properties.Resources.driveChamber1);

  gChamber = Graphics.FromImage(bChamber);
  gChamber.FillEllipse(brushChamber, VirtualViewX(), VirtualViewY(), 10, 10);
  pictureBoxDriveView.Image = bChamber;        
}

現在、パフォーマンスを最適化する方法を探しています。たとえば、0.2秒ごとに画像を再描画すると、プログラムが非常に遅くなり、他に何もできなくなります。しかし、最終的には円のより滑らかな動きが必要です。1000 ミリ秒のリフレッシュ レートでどのように遅れるか想像してみてください。

これを行うには、ビットマップ全体を毎回ロードするより良い方法はありますか?

4

4 に答える 4

2

コントロールを意図したとおりに使用してください。

  • ビットマップを自分で再描画しないでください。
  • Pictureboxに1回ロードするだけです。
  • ピクチャ ボックスの Paint イベントを処理して楕円を描画する
  • 座標が変わるたびにピクチャボックスを無効にします。
于 2013-05-10T10:02:21.103 に答える
0

コントロール (PictureBox) で円を 1 回描画します。

コントロールを 300x300 の画像ボックス全体に配置します。

変数が変更された場合にのみ、ピクチャボックスの位置を円で更新します。

このようにして、何度も描画するのを防ぎます。

于 2013-05-10T09:44:20.637 に答える
0

DoubleBufferedフォームのプロパティを に設定してみてくださいtrue。これにより、通常、パフォーマンスが向上します。

また、これを入れる必要があります

// Retrieve the image.
bChamber = new Bitmap(global::Project.Properties.Resources.driveChamber1);

クラスコンストラクターで。

于 2013-05-10T09:44:48.910 に答える
-1

これを試してみてください。毎回ディスクからイメージをロードするわけではないので、費用がかかりません。

private Image _origImage = new Bitmap(global::Project.Properties.Resources.driveChamber1);

void DrawEllipse()
{
    // Retrieve the image.
    Image bChamber = new Bitmap((Image)this._origImage.Clone());

    Graphics gChamber = Graphics.FromImage(bChamber);

    gChamber.FillEllipse(brushChamber, VirtualViewX(), VirtualViewY(), 10, 10);
    pictureBoxDriveView.Image = bChamber;
}
于 2013-05-10T09:44:25.650 に答える