PictureBox двойной буфер задержки нажатия клавиш?

Иногда, если я удержу, например, левую клавишу со стрелкой, 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 ответ

Решение

В основном вы начинаете тему (grabValues, реализованный функцией RInvokeMe) которые бесконечно вызывают на вашей форме методы MUpdate а также CUpdate, Когда вы вызываете метод, вы помещаете сообщение в очередь сообщений Windows, чтобы позволить окну выполнить данную функцию. Но когда вы нажимаете клавишу, даже сообщение о нажатии клавиши отправляется в очередь Windows... но, возможно, оно не обрабатывается быстро из-за множества запросов на вызов, которые вы уже выполняете в форме.

Вы можете попробовать ввести небольшую задержку (Thread.Sleep(500);) в вашем RInvokeMe цикл, чтобы увидеть, есть ли проблема...

Тогда, если это так, я бы решил полностью изменить дизайн вашего проекта, чтобы избежать такого сценария (если ваши персонажи перемещаются только при нажатии клавиш, почему вы просто не перерисовываете сцену только при нажатии клавиш, но делаете это непрерывно?)

Другие вопросы по тегам