2013-04-04 4 views
0

Вы хоть представляете, как объект 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++; 
          } 
    

Помощь .... :)

+0

Вы должны показать нам свой код, если вы хотите, мы могли бы помочь вам –

+2

Любой рисующий код, который необходимо сделать сотни тысяч путей будет медленным. Нет волшебного исправления, вам нужно будет пересмотреть свой дизайн. Возьмите подсказку, скажем, с картами Google, и обратите внимание, как она начинает обрезать детали при уменьшении масштаба. –

ответ

0

Для обеспечения высокой производительности рендеринга, DiRectX является perferred над WPF. Вы также можете использовать opengl в C#.

Edit: Для урока о том, как использовать Open GL в C# с помощью рамках ТАО, посетите ниже ссылке: http://xinyustudio.wordpress.com/2008/12/01/using-opengl-in-c-taoframework/

Смежные вопросы