Самый быстрый способ получить перерисовку с постоянной скоростью - это сохранить все изображение, нарисованное как растровое изображение, и, конечно, обновить его, когда пользователь рисует. Таким образом, вы можете перерисовать нужную вещь и даже добавить полосы прокрутки и тому подобное, если хотите. Например, вы можете сохранить массив точек для функции отмены.
Если вместо этого вы хотите создать программу векторного рисования, то вам нужно сохранить отдельные примитивные операции (такие как линии, прямоугольники и т. Д.). В этом случае все еще окупается сохранение изображения для быстрой перекраски, и теперь хитрость заключается в том, как эффективно обновить это изображение, когда пользователь изменяет чертеж (например, изменяя размер прямоугольника). Один из способов сделать это - разбить область рисования на множество меньших, поэтому вам нужно только пересчитать базовое изображение для частей, которые пересекаются с изменяемым пользователем объектом.
В обоих методах вы бы использовали двойную буферизацию, чтобы пользователь не воспринимал мерцание. Но только с двойной буферизацией «перерисовка всего набора точек» все равно будет медленной.