Вы хоть представляете, как объект Graphics использует ресурсы?Работа с увеличенным графическим изображением действительно медленная
Я рисую несколько тысяч объектов GraphicsPath с координатой долготы широты на панели. Первоначально эти Graphicspaths должны быть увеличены (трансформированы - фактически на 4 матрицы). Затем пользователь может перемещать карту вокруг, масштабировать, причем каждое действие вызывает перерисовку графического пути.
Проблема в том, что все это по-прежнему реагирует, когда уровень масштабирования составляет около 2000-10000, но когда он доходит до сотен тысяч (это увеличение масштаба на улице), это занимает слишком много времени, чтобы рисовать и приводить к тому, что все приложение не отвечает , Проверьте свободную память, еще много их. Использование ЦП по-прежнему в порядке.
Как нарисовать одни и те же тысячи графического пути, с одним и тем же преобразованием в четыре матрицы, каждый из которых становится чрезвычайно медленным, когда коэффициент масштабирования увеличивается? Является ли проблема в самой System.Graphics при обработке координаты Graphics Path с большим количеством? Вы, ребята, сталкиваетесь с одной и той же проблемой?
К сожалению хороших людей, не включать код: так вот кусок из «медленного» кода: basicaly итерации часть метода _paint. он проходит более 30 000 графических путей, большинство из них - это полилинии, извлеченные из файлов esri shp. координаты для x равны +, а y - и переворачиваются вверх дном, поэтому требуемое матричное преобразование должно быть нарисовано на панели. Проблема заключается в переменной с низким значением zI, она намного быстрее, чем переменная hi-value zI. Привет-значение zi означает, что большая часть графического пути находится за пределами окрашенной области. Я пытаюсь уменьшить количество zi, проверив isVisible или связав границу прямоугольника. но это все еще недостаточно быстро. есть идеи?
foreach (GraphicsPath vectorDraw in currentShape.vectorPath) { GraphicsPath paintPath = (GraphicsPath)vectorDraw.Clone(); OperationMatrix = new Matrix(); OperationMatrix.Translate(-DisplayPort.X, -DisplayPort.Y); paintPath.Transform(OperationMatrix); OperationMatrix = new Matrix(); OperationMatrix.Scale(zI, zI); paintPath.Transform(OperationMatrix); OperationMatrix = new Matrix(1, 0, 0, -1, 0, DisplaySize.Height); paintPath.Transform(OperationMatrix); OperationMatrix = new Matrix(); OperationMatrix.Translate(ClientGap.Width, -ClientGap.Height); paintPath.Transform(OperationMatrix); //if (WiredPort.IsVisible(paintPath.GetBounds())) //Futile attempt //{ Pen LandBoundariesPen = new Pen(Color.FromArgb(255, 225, 219, 127)); GraphContext.DrawPath(LandBoundariesPen, paintPath); // this is the slowest part. When commented it goes faster. pathCountX++; }
Помощь .... :)
Вы должны показать нам свой код, если вы хотите, мы могли бы помочь вам –
Любой рисующий код, который необходимо сделать сотни тысяч путей будет медленным. Нет волшебного исправления, вам нужно будет пересмотреть свой дизайн. Возьмите подсказку, скажем, с картами Google, и обратите внимание, как она начинает обрезать детали при уменьшении масштаба. –