Ну, для начала, выясните, как часто вам нужно для перекраски, чтобы получить эффект, который вы ищете. Прямо сейчас вы перерисовываете в ответ на события мыши, но их может быть на много больше, чем вы думаете, и вам, вероятно, не нужно перерисовывать для каждого из них. Рисование (в ответ на Invalidate () ) по большей части имеет низкий приоритет, но это просто означает, что вам придется использовать любой запасной ЦП для этого, а лучше отслеживать время. Вы в последний раз перекрашиваетесь и избегаете делать это слишком рано.
Использование таймера для фиксирования частоты обновления на некоторой постоянной (начните с задержки 40 мс для частоты обновления приблизительно 25 Гц и увеличивайте или уменьшайте при необходимости) - это простой способ сделать это ... Таймеры (System.Windows. По крайней мере, Forms.Timer) также имеют низкий приоритет, поэтому вам не нужно беспокоиться о логике обновления, вытесняющей более важные обработчики событий.
Конечно, сохраните существующий код, который вы используете, чтобы определить, действительно ли что-либо изменилось . Установите флаг, когда он установлен, и когда этот флаг установлен , а не , просто ничего не делайте в обработчике событий таймера.
После этого вы увидите немедленное уменьшение максимального времени обработки, поскольку вы отсоединили частоту обновления от скорости мыши. Вы также обнаружите, что у вас больше контроля над временем обработки медиана , так как частота обновления находится под вашим контролем: слишком высокое, уменьшите частоту тиков таймера; недостаточно гладко, увеличение это!