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

按照预期的方式使用控件。

  • 不要自己重绘位图。
  • 只需在图片框中加载 1x 即可。
  • 处理图片框的Paint事件绘制椭圆
  • 每当您的坐标发生变化时,图片框就会失效。
于 2013-05-10T10:02:21.103 回答
0

在控件中绘制一次圆圈(PictureBox)

将控件放在 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 回答