2014-12-22 3 views
3

Я использую GraphicsLayer для обозначения дороги с SimpleLineSymbol. мой код же с кодом ниже:performance at arcgis silverlight api

for (int i = 0; i < 200000; i++) 
    { 
     myGraphicsLayer.Graphics[i].Symbol = mySimpleLineSymbol; 
    } 

этот код работать быстро, но рисовать linesymbol на карте очень медленно (около 6 секунд).. , пожалуйста, помогите мне увеличить производительность символики.

+0

После этого цикла у вас есть скрытый флаг этого слоя, прежде чем добавлять его на карту? Я думаю, что вы можете использовать против события обновления на уровне слоя во время обновления(), где вы можете вызвать show(). {Примечание. В моем приложении не было достаточного количества символов для изучения этого подхода, но вы делаете}. – maurice

ответ

2

Я собираю всю геометрию в одну полилинию и создаю для нее одну графику. то я создаю символ и дисплей. Требуется одна секунда для рендеринга и отображения на карте.

 var myPolyline = new ESRI.ArcGIS.Client.Geometry.Polyline(); 

     for (int i = 0; i < 200000; i++) 
     { 
      myPolyline.Paths.Add(((ESRI.ArcGIS.Client.Geometry.Polyline)myGraphicsLayer.Graphics[i].Geometry).Paths[0]); 
     } 

     Graphic myGraph = new Graphic(); 

     myGraph.Geometry = myPolyline; 

     ESRI.ArcGIS.Client.Symbols.SimpleLineSymbol sym = new ESRI.ArcGIS.Client.Symbols.SimpleLineSymbol(); 

     sym.Color = new SolidColorBrush(Colors.Red); 

     sym.Width = 2; 

     myGraph.Symbol = sym; 

     myGraphicsLayer.Graphics.Add(myGraph); 
0

Это много линий. Одна из идей заключалась бы в сокращении количества строк, которые нужно нарисовать. Вы можете проверить уровень масштабирования или масштаб карты и использовать это при определении линий для рисования. Например, возможно, в определенных масштабах вы делаете только определенные дороги, например, основные дороги. Вы можете сделать это, добавив, если заявление в цикле, который проверяет наличие конкретного атрибута (предполагается, что она существует):

if (myGraphicsLayer.Graphics[i].Attributes["Type"] == "major") { } 
+0

Спасибо за ваш ответ. я должен рисовать все строки в полном объеме. – MTSS

+1

фактически все линии являются основными. – MTSS

0

Поскольку у вас есть множество функций, производительность всегда будет влияние, хотя есть несколько вещи, которые следует учитывать. Сначала убедитесь, что у вас есть последние версии Silverlight и Esri API, поскольку часто появляются улучшения производительности в новых версиях. Поскольку вы выполняете рендеринг на клиенте, характеристики хост-машины влияют на производительность, и если вы не можете воспользоваться масштабируемым рендерингом или кластеризацией объектов, и вы просто используете основной символ функции, то единственный способ повысить производительность заключается в рендеринге функций на сервере с использованием ArcGIS Server и потреблении их в качестве слоя службы динамической карты. Это будет означать, что вы не сможете использовать maptips и т. Д., Хотя для этого есть некоторые обходные пути, такие как отображение всплывающих окон при наведении. Вы также можете легко реализовать идентификацию при щелчке.

+0

По причинам, которые я должен сделать рендеринг на стороне клиента, и я немного ограничен. Есть ли способ узнать, через какое время после завершения выполнения кода? Есть ли событие в GraphicsLayer для этого? – MTSS

+0

Вы можете попробовать прослушать событие для продвижения по карте, хотя я не могу вспомнить, если это срабатывает для графических слоев. Кроме того, вы пытались использовать средство визуализации вместо установки символа для каждой функции? Это будет быстрее. –

+0

событие прогресса карты не срабатывает для Graphicslayers и я тестирую свойство renderer вместо установки символа; он медленнее, чем установленный Symbol Property.i тест SimpleRenderer и UniqueValueRenderer. – MTSS

0

Вы можете разделить задачу между потоками для параллельной работы для лучшей производительности.

new Thread(() => 
      { 
       Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        for (int j = 0; j < 50000; j++) 
        { 

         myGraphicsLayer.Graphics[j].Symbol = mySimpleLineSymbol; 
        } 
       }); 

      } 
).Start(); 


      new Thread(() => 
      { 
       Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        for (int k = 50000; k < 100000; k++) 
        { 
         myGraphicsLayer.Graphics[k].Symbol = mySimpleLineSymbol; 
        } 
       }); 

      } 
).Start(); 


      new Thread(() => 
      { 
       Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        for (int l = 100000; l < 150000; l++) 
        { 
         myGraphicsLayer.Graphics[l].Symbol = mySimpleLineSymbol; 
        } 
       }); 

      } 
).Start(); 


      new Thread(() => 
      { 
       Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        for (int m = 150000; m < 200000; m++) 
        { 
         myGraphicsLayer.Graphics[m].Symbol = mySimpleLineSymbol; 
        } 
       }); 

      } 
).Start(); 
Смежные вопросы