PictureBox双缓冲按键滞后?

时间:2014-04-09 02:57:45

标签: c# picturebox double-buffering

有时,如果我按住左箭头键,则pictureBox将停止绘制我的角色的坐标。一个典型的例子是用红色环绕的黄点。通过按住左箭头键,pictureBox没有经常绘制我的角色位置,直到我按下另一个键/放开箭头键,然后图片框再次开始更新(因为你可以看到环绕紫色)。

此外,我遇到的另一个错误是它应该只画一个黄点和一个蓝色的漩涡'每个地点;虽然它正在绘制多个(如你所见)。

以下代码是我用来复制图片结果的代码。

private Thread grabValues;

private Bitmap bm;

private Image image1;
private Image image2;

private Graphics gM;

void RGraphics()
{
    image1 = Properties.Resources.image1;
    image2 = Properties.Resources.image2;
}

void RInvokeMe()
{
    while (true)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new UpdateControlsDelegate(MUpdate));
            this.Invoke(new UpdateControlsDelegate(CUpdate));
        }
        else
        {
            MUpdate();
            CUpdate();
        }
    }
}

void MUpdate()
{
  pictureBox1.ImageLocation = "http://urlexample/r/we.png";
}

void CUpdate()
{
        bm = new Bitmap(pictureBox1.Image);

        gM = Graphics.FromImage(bm);

        gM.CompositingMode = CompositingMode.SourceOver;

        MDraw.DrawBlueDot(gM, image2, X2, Y2);
        MDraw.DrawYellowDot(gM, image1, X1, Y1);

        pictureBox1.Image = bm;
        pictureBox1.Refresh();
}

public Form2()
{
    InitializeComponent();

    RGraphics();

    grabValues = new Thread(new ThreadStart(RInvokeMe));
    grabValues.IsBackground = true;
    grabValues.Start();
}

1 个答案:

答案 0 :(得分:3)

基本上你开始一个线程(grabValues,由函数RInvokeMe实现),它在你的表单方法MUpdateCUpdate上无休止地调用。当您调用方法时,您在Windows消息队列上发布消息,以便让窗口执行给定的函数。但是,当您按下某个键时,即使 keypress 消息也会发布到Windows队列中......但由于您已在表单上执行了大量的调用请求,因此可能无法快速提供。

您可以尝试在Thread.Sleep(500);循环中引入一个小延迟(RInvokeMe),看看问题是否存在......

然后如果是这样,我会考虑完全重新设计你的项目以避免这种情况(如果你的角色只在按键时移动,为什么你只是在按键时不重绘场景但是你做了它不断?)