Приложение для рисования GDI с высокой загрузкой процессора - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть приложение, в котором пользователь рисует несколько фигур. Когда я щелкаю фигуру и перетаскиваю ее, процессор загружается на 100% из-за Invalidate () внутри MouseMove. Если я использую таймер и вызываю Invalidate () из тикового события, перемещение не так плавно. Есть ли другой подход, чтобы минимизировать процессор и иметь плавное движение?

  ` Point startDragMousePoint;
    Point startShapeLocation;
    private void Canvas_MouseMove(object sender, MouseEventArgs e)
    {
        if(isMouseDown)
        {
            Point deltaPoint = Point.Subtract(e.Location, new Size(startDragMousePoint));
            shape.Location = Point.Add(startShapeLocation, new Size(deltaPoint));
            Invalidate();
        }
    }

    private void Canvas_Paint(object sender, PaintEventArgs e)
    {
       shape.Render(e.Graphics);
    }`

Ответы [ 3 ]

0 голосов
/ 04 ноября 2011

Вместо того, чтобы аннулировать всю область, вы можете сделать недействительной часть элемента управления, которая изменилась, используя:

Rectangle changedArea = new Rectangle(cX, cY, cW, cH);
this.Invalidate(changedArea);

Также убедитесь, что ваш элемент управления настроен на использование DoubleBuffering

 this.DoubleBuffered = true;
0 голосов
/ 04 ноября 2011

Из ограниченного кода, который вы добавили, я думаю, что аннулирование не вызовет никаких проблем. Скорее всего, проблема может быть в реальном коде рендеринга вашей shape.Render (). В прошлом я написал подобное приложение, в котором я назвал Invalidate при перемещении мыши, и приложения работали нормально. Только было некоторое мерцание, которое исчезло при включении двойной буферизации.

0 голосов
/ 04 ноября 2011

Существует три основных решения.

1) Не рисуйте во время движения, это было решением для окон в течение длительного времени, когда вы перетаскивали окно, оно просто исчезало и вы видели контурокна.

2) Создайте растровый объект и только переместите его.Обратите внимание, что вам придется перерисовать область под ним.

3) Не лишать законной силы окно отверстия, только область, которую вы изменяете.Рисование в буфер (растровое изображение) может помочь вам повторно использовать области.

Кроме того, если GDI не самая быстрая функция рисования в мире.Если ваша форма очень сложна, вы можете рассмотреть возможность использования OpenGL, DirectX или SDL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...