<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: WPF GraphicsLayer Limits, for large number of graphics and multiple layers in ArcGIS Runtime SDK for WPF (Retired) Questions</title>
    <link>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/wpf-graphicslayer-limits-for-large-number-of/m-p/594098#M3054</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;There are a number of optimizations available in the API when working with graphics. Firstly there's the map itself. You have the option of using the entirely WPF based map rendering pipeline which supports things like custom XAML symbols or you can use the GIS-optimized map rendering pipeline which provides greater performance but at the expense of those fancy animated symbols. To enable the latter set Map.UseAcceleratedDisplay to True.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For getting graphics into GraphicsLayers in the first place, I see you are already using AddRange which is good. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;GraphicsLayers have two rendering modes - "Static" and "Dynamic". Dynamic is the traditional mode and provides a better visual experience when zooming in/out but is less suitable for larger numbers of graphics, which is where the static mode helps. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When symbolizing graphics you should try to use renderers (SimpleRenderer, UniqueValueRenderer, ClassBreaksRenderer) instead of setting symbols individually on graphics. If you would like to update the geometry of point graphics, there's a MoveTo method which provides greater performance over setting a new geometry into the graphic. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regarding other aspects which affect performance, MapTips involve a hittest on mouse move and therefore are likely to be more expensive than say an InfoWindow which is displayed on mouse click. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Hope that helps&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Cheers&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Mike&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 27 Feb 2014 09:07:44 GMT</pubDate>
    <dc:creator>MichaelBranscomb</dc:creator>
    <dc:date>2014-02-27T09:07:44Z</dc:date>
    <item>
      <title>WPF GraphicsLayer Limits, for large number of graphics and multiple layers</title>
      <link>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/wpf-graphicslayer-limits-for-large-number-of/m-p/594097#M3053</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;We have a performance question on WPF "GraphicsLayer". Our desktop application uses ArcGIS Runtime SDK for WPF 10.2.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;We are trying to determine the maximum number of graphics(points) that we can put on a graphicsLayer. We would also like to &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;know if any of the characteristics of the graphics are more costly than others, such as Maptip, attributes, zoom function, etc.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also, if we spread them (the graphics) across multiple layers, what limits and &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;performance impacts (positive or negative) should we be aware of using multiple layers for these&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;large number of graphics?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is a snipppet from our applicaiton.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Scenario:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;For some number of approximately 1 to 50 sets of groups of graphics&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(with 1 to 200 groups in each set having 1 to 20 graphics per group) to be drawn on the map:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(potentially as much as 200,000 points)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Code:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Step 1:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;for (&amp;lt;each group...&amp;gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddPointsToGraphicsListDispatch(....);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Step 2:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;AddGraphicsToLayerDispatch(...);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// Step 1: Adding graphics to a List&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;private bool AddPointsToGraphicsListDispatch(...)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; List&amp;lt;Graphic&amp;gt; AddGraphicsList = GraphicsListParam;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; Graphic gr = new Graphic&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; Geometry = _mercator.FromGeographic(new MapPoint(longitudeLocal, latitudeLocal)),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; Symbol = newSymbol, // newSymbol is a SimpleMarkerSymbol (point)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; MapTip = CreateToolTip(userData, latitudeLocal, longitudeLocal, imeiData, imsiData, phoneNumberData, pair.ResultId, target.TargetId,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; requestId, pair.MLCTime.ToString(), reqType, null, GetCallingNumber(target.TargetId, requestId), null, accuracy),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; };&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; gr.Attributes["Latitude"] = latitudeLocal;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; gr.Attributes["Longitude"] = longitudeLocal;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; gr.MouseEnter -= GraphicOnMouseEnter;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; gr.MouseEnter += GraphicOnMouseEnter;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; gr.MouseLeftButtonUp += GraphicMouseLeftButtonUp;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; gr.SetZIndex(zOrder);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; AddGraphicsList.Add(gr); &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; //second graphic&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; Graphic uigraphic = new Graphic&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; Geometry = _mercator.FromGeographic(new MapPoint(longitudeLocal, latitudeLocal)),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; Symbol = symbol,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; MapTip = CreateToolTip(userData, latitudeLocal, longitudeLocal, imeiData, imsiData, phoneNumberData, pair.ResultId, target.TargetId,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; requestId, pair.MLCTime.ToString(), reqType, null, null, null, accuracy)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; };&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; uigraphic.SetZIndex(zOrder);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; zOrder = +zOrder;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; AddGraphicsList.Add(uigraphic);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// Step 2:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Remove old graphics from map&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Add new graphics from graphics list to graphicsLayer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;private bool AddGraphicsToLayerDispatch(List&amp;lt;Graphic&amp;gt; GraphicsListParam, List&amp;lt;Graphic&amp;gt;&amp;gt; PrevGraphicsListParam)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; List&amp;lt;Graphic&amp;gt; AddGraphicsList = GraphicsListParam; // the list where graphics were added earlier&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; Dictionary&amp;lt;Tuple&amp;lt;Int32, Int32&amp;gt;, List&amp;lt;Graphic&amp;gt;&amp;gt; PrevGraphicsList = PrevGraphicsListParam; // previously added graphics were saved in a list for removal from map&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; if (null == (List&amp;lt;Graphic&amp;gt;)(PrevGraphicsListParam[new Tuple&amp;lt;int, int&amp;gt;(RequestId, TargetRef.TargetId)] = (this.Dispatcher.Invoke((new Func&amp;lt;List&amp;lt;Graphic&amp;gt;&amp;gt;(() =&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; var graphicsLayer = MainMap.Layers[Layer] as GraphicsLayer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; if (null != PrevGraphicsList &amp;amp;&amp;amp; PrevGraphicsList.ContainsKey(new Tuple&amp;lt;int, int&amp;gt;(RequestId, TargetRef.TargetId)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; foreach (Graphic gr in PrevGraphicsList[new Tuple&amp;lt;int, int&amp;gt;(RequestId, TargetRef.TargetId)])&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; // Remove old graphics before adding new ones&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (graphicsLayer.Graphics.Contains(gr))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; graphicsLayer.Graphics.Remove(gr);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; PrevGraphicsList.Remove(new Tuple&amp;lt;int, int&amp;gt;(RequestId, TargetRef.TargetId));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; // Add new graphics to the graphicsLayer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; graphicsLayer.Graphics.AddRange(AddGraphicsList);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; graphicsLayer.Refresh();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; if (zoom) ZoomToLocate(_latitude, _longitude);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; // Save the new list for the next removal&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return AddGraphicsList;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; ......&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 26 Feb 2014 22:22:00 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/wpf-graphicslayer-limits-for-large-number-of/m-p/594097#M3053</guid>
      <dc:creator>FarzanaYasmeen</dc:creator>
      <dc:date>2014-02-26T22:22:00Z</dc:date>
    </item>
    <item>
      <title>Re: WPF GraphicsLayer Limits, for large number of graphics and multiple layers</title>
      <link>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/wpf-graphicslayer-limits-for-large-number-of/m-p/594098#M3054</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;There are a number of optimizations available in the API when working with graphics. Firstly there's the map itself. You have the option of using the entirely WPF based map rendering pipeline which supports things like custom XAML symbols or you can use the GIS-optimized map rendering pipeline which provides greater performance but at the expense of those fancy animated symbols. To enable the latter set Map.UseAcceleratedDisplay to True.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For getting graphics into GraphicsLayers in the first place, I see you are already using AddRange which is good. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;GraphicsLayers have two rendering modes - "Static" and "Dynamic". Dynamic is the traditional mode and provides a better visual experience when zooming in/out but is less suitable for larger numbers of graphics, which is where the static mode helps. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When symbolizing graphics you should try to use renderers (SimpleRenderer, UniqueValueRenderer, ClassBreaksRenderer) instead of setting symbols individually on graphics. If you would like to update the geometry of point graphics, there's a MoveTo method which provides greater performance over setting a new geometry into the graphic. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regarding other aspects which affect performance, MapTips involve a hittest on mouse move and therefore are likely to be more expensive than say an InfoWindow which is displayed on mouse click. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Hope that helps&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Cheers&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Mike&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 27 Feb 2014 09:07:44 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/wpf-graphicslayer-limits-for-large-number-of/m-p/594098#M3054</guid>
      <dc:creator>MichaelBranscomb</dc:creator>
      <dc:date>2014-02-27T09:07:44Z</dc:date>
    </item>
  </channel>
</rss>

