Для базовых элементов отображения, таких как линии, вам следует рассмотреть возможность их разбивки на несколько частей, если вам абсолютно необходимо аннулировать все их границы за цикл рисования.
Причина этого в том, что GDI + (как и сам GDI) делает недействительными области в прямоугольных формах, как вы указываете с помощью ограничительной рамки. Вы можете убедиться в этом сами, протестировав некоторые горизонтальные и вертикальные линии по сравнению с линиями, где наклон подобен аспекту вашей области отображения.
Итак, допустим, ваш холст 640х480. Если вы рисуете линию от 0,0 до 639 479; Invalidate () сделает недействительным весь регион с 0,0 до 639,0 сверху вниз, с 0,479 до 639,479 снизу. Горизонтальная линия, скажем, от 0,100 до 639,100, дает прямоугольник высотой всего 1 пиксель.
У регионов будет та же самая проблема, потому что регионы рассматриваются как наборы горизонтальных экстентов, сгруппированных вместе. Таким образом, для большой диагональной линии, идущей из одного угла в другой, чтобы соответствовать ограничивающей рамке, которую вы установили, регион должен будет указывать либо каждый набор пикселей на каждой вертикальной линии, либо весь ограничивающий прямоугольник.
Так что в качестве решения, если у вас очень большая линия, разбейте ее на четверти или восьмые, и производительность должна значительно возрасти. Пересматривая приведенный выше пример, если вы просто разделите пополам на две части, вы уменьшите общую недействительную область до 0,0 x 319 239 плюс 320 240 x 639 479.
Вот наглядный пример разделения на четверть. Розовая область - это то, что недействительно. К сожалению, ТАК не позволяет мне публиковать изображения или более 1 ссылки, но этого должно быть достаточно, чтобы все объяснить.
(линия разделена на четверти, общая недействительная область - 1/4 поверхности)
экстент 640x480 с четырьмя прямоугольниками одинакового размера, вырезанными за линией, проведенной по диагонали
Или, вместо того, чтобы указать ограничивающий прямоугольник, вы можете рассмотреть возможность переписать ваши обновления, чтобы вы рисовали только те части элементов, которые соответствуют области, которую необходимо обновить. Это действительно зависит от того, сколько объектов должно участвовать в нарисованном обновлении. Если у вас есть тысячи объектов в данном кадре, вы можете просто игнорировать все недействительные области и перерисовать всю сцену.