Я немного рисую с помощью System.Drawing, и у меня возникли некоторые проблемы.
Я держу данные в очереди, и я рисую (графически) эти данные в три графических блока
этот метод заполняет графическое поле, затем прокручивает график по горизонтали.
чтобы не рисовать поверх предыдущих рисунков (и постепенно выглядят более грязно), я нашел 2 решения для рисования графика.
- Вызов
plot.Clear(BACKGOUNDCOLOR)
до цикла отрисовки [прокомментированный блок]
хотя это приводит к появлению мерцания со времени, необходимого для выполнения фактического цикла рисования.
- вызов
plot.DrawLine(channelPen[5], j, 140, j, 0);
перед каждой ничьей [прокомментировано]
хотя это приводит к тому, что рисование начинается нормально, а затем очень быстро замедляется до сканирования, как если бы перед командой рисования была помещена команда ожидания.
Вот код для справки:
/*plotx.Clear(BACKGOUNDCOLOR)
ploty.Clear(BACKGOUNDCOLOR)
plotz.Clear(BACKGOUNDCOLOR)*/
for (int j = 1; j < 599; j++)
{
if (j > RealTimeBuffer.Count - 1) break;
QueueEntity past = RealTimeBuffer.ElementAt(j - 1);
QueueEntity current = RealTimeBuffer.ElementAt(j);
if (j == 1)
{
//plotx.DrawLine(channelPen[5], 0, 140, 0, 0);
//ploty.DrawLine(channelPen[5], 0, 140, 0, 0);
//plotz.DrawLine(channelPen[5], 0, 140, 0, 0);
}
//plotx.DrawLine(channelPen[5], j, 140, j, 0);
plotx.DrawLine(channelPen[0], j - 1, (((past.accdata.X - 0x7FFF) / 256) + 64), j, (((current.accdata.X - 0x7FFF) / 256) + 64));
//ploty.DrawLine(channelPen[5], j, 140, j, 0);
ploty.DrawLine(channelPen[1], j - 1, (((past.accdata.Y - 0x7FFF) / 256) + 64), j, (((current.accdata.Y - 0x7FFF) / 256) + 64));
//plotz.DrawLine(markerPen, j, 140, j, 0);
plotz.DrawLine(channelPen[2], j - 1, (((past.accdata.Z - 0x7FFF) / 256) + 94), j, (((current.accdata.Z - 0x7FFF) / 256) + 94));
}
Есть ли уловки, чтобы избежать этих накладных расходов?
Если бы не было каких-либо других / лучших решений?
РЕДАКТИРОВАТЬ: см. [Окончательное решение] ниже для кода решения