POST
|
Hi Mike, Thank you for your reply. Sadly, that is not an option at the momet. We are using complex symbology in some situations (ControlTemplates with triggers to change the appearance of the symbol) for many of the graphics layers, so that puts a stop to having the whole map accelerated. Hopefully this can change in time, but not soon. Hopefully might have some other suggestions related to reducing memory build-up? Today I read all bytes from file (as described here), and return the BitmapSource. This is because DynamicLayer/TileLayer doesn't support FileWebRequest (any plans on supporting that?. InvalidCastException). I tried creating a small WCF Rest service to return the tile using a Url, but I have the same build up. I can reproduce the same using multiple ArcGisTiledLayer instances as well. I do realize having many base layers may not make much sense, but POI objects and other overlay information are also loaded through the same custom layer, which returns a bitmap in the same way. I suppose there is not much else you can do about cleaning up these resources? Using BitmapFrame instead of BitmapSource allows me to freeze the object, but it doesn't make any difference in regards to the build up of resources.
... View more
04-03-2014
12:57 AM
|
0
|
0
|
288
|
POST
|
Hi, I have implemented some custom layers (derived from DynamicLayer and TiledLayer). When I use many of these layers, including some existing layers in the runtime, I experience a build-up of memory, which is then garbage collected. Sometimes the GC doesn't hit soon enough, and I get out of memory exception. I've done some research, and pinpointed the build-up to BitmapImage. If I use my custom layers inside of AcceleratedDisplayLayer, implementing the appropriate interfaces, I don't get this issue. I have tried freezing the image, but then I get an InvalidOperationException when the base class is doing cleanup of resources. It can't set the image.Source = null because the image IsFrozen. Are there any plans to change this, or ways that I can still use frozen images? I did a sample a while ago where I converted a GDI bitmap into a bitmapsource using Interop helpers, and those I could freeze for some reason. But I found another memory leak to that, so no cigar. Any suggestions?
... View more
04-02-2014
01:39 AM
|
0
|
2
|
1333
|
POST
|
It appears that setting the PanDuration of the map to 0 fixes the issue. I have chosen not to mark the post as answered while I wait for a representative from Esri to review this.
... View more
03-18-2014
02:03 AM
|
0
|
0
|
199
|
POST
|
I have an issue using a client over a Remote Desktop connection, where a pan operation sometimes makes the map jump very far in the pan direction. Say I want to pan a few kilometers southwest, I suddenly end up in a part of the world where I have no map. This is a very strange behavior, and it is quite critical for the user. The customer is using Blade servers (http://en.wikipedia.org/wiki/Blade_server), and experience the same behavior. Anyone who have experienced this, and have a way to fix it? I'm using version 10.2 of the SDK. Different kinds of layers. This never happened on version 2.3 of the controls. We are not using accelerated displays or layers.
... View more
03-17-2014
06:05 AM
|
0
|
1
|
1191
|
POST
|
Well, this is embarresing.... At least slightly. Only a few hours after posting the question, I may have found the answer. To my defence, I've been wrestling with this issue for a while, and pulling my hair and banging my head against the desk might actually have helped 🙂 Instead of deleting the question, I'll provide the solution to others who might struggle with similar issues (sadly I can't change the main title, only the title of the reply). Instead of working on the Bitmap and converting it into a BitmapImage, I get the bytes of the image
private byte[] GetBitmapBytes(Bitmap bitmap)
{
if (bitmap == null)
{
return null;
}
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Close();
return stream.ToArray();
}
}
When I then eventually want the BitmapImage, I create a new BitmapImage based on a new MemoryStream, and return it
private BitmapImage ConvertBytesToImage(byte[] imageBytes)
{
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
MemoryStream memoryStream = new MemoryStream(imageBytes);
bitmapImage.StreamSource = memoryStream;
bitmapImage.EndInit();
return bitmapImage;
}
I pray that the Map/TiledLayer/BitmapImage disposes of the memorystream when it is done. I have seen no signs that the memory is growing particularly (yet, anyways). The files I have stored in my cache on disk are read from and written to using File.ReadAllBytes(tilePath) and File.WriteAllBytes(tilePath, imageBytes). I haven't gotten as far as benchmarking the performance, but the leak is gone, and when the tiling works properly, that is probably not an issue. Hope this was of help to anyone who might run into similar issues. If you can see any problems with this approach, please let me know.
... View more
02-21-2014
08:14 AM
|
0
|
0
|
202
|
POST
|
Hi, I need to support custom data sources in my map (for reasons that I will not go into here), and the datasource is not natively supported by ArcGis Runtime SDK for WPF. The underlying technology can only handle System.Drawing.Bitmap, and these I convert into BitmapImage. This has been implemented as DynamicLayer, and works great. The images are generated on a background thread, and all is pretty good. Because the underlying data is sometimes somewhat slow, I would like to turn this layer into a TiledLayer. The way of generating the tiles is identical to when using DynamicLayer, and seems to work just fine. But wait.... There is a memory leak with both approaches, but it becomes more evident with the tiled approach. There are unmanaged bitmap handles related to the conversion process from Bitmap to BitmapImage. I have not yet found a way to convert the bitmap without getting different unmanaged bitmap handles retained in memory (that might be cleared up eventually, but not fast enough). System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap (and deleting the handle), saving bitmap to memorystream, etc still retains memory. Since I'm creating tiles and storing them on disk for later requests, I would like to assign the UriSource of the bitmapimage to the file path on disk, but I get an exception saying it can't cast FileWebRequest to HttpWebRequest. Is there a particular reason why this can't is not supported? Loading the BitmapImage from disk using different LoadOption, CacheOptions, etc doesn't seem to help with the memory issue. Any suggestions would be welcome, but I know it is not within the scope of this forum. I event tried wrapping the export operation inside of a REST service to utilize the existing functionality in TiledLayer/TiledMapServiceLayer, but I lost the background functionality (as far as I came, at least). And adding additional layers to be able to return the image through a memorystream is a bit exessive, in addition to other issues that might arise from this. I think this issue might be resolved using a FileWebRequest, but I'm not sure. And since I can't wait untill this might be supported in the future, do you have any suggestions for getting rid of the memory leak?
... View more
02-21-2014
05:54 AM
|
0
|
1
|
1952
|
POST
|
I didn't experience any issues with that sample. I just tried creating my own sample, but the services providing the maps I am looking for are not publicly available. The WMS I'm accessing is http://wms.norgeibilder.no/services/wms/wms.aspx?request=getcapabilities. My base map is in spatial reference epsg 32633 (custom layer exported from MXD), and the WMS defaults to epsg 25832. They are both displayed, but there is an offset between them. The image of scandinavia from the WMS is then rendered somewhere in the Baltics, on top of the base map. I was able to "fix" this issue by deriving from WMS layer to set the spatial reference system in the constructor. That way I lose the ability to verify that the srs is actually supported. If the spatial reference is null,the WMS will assign the first in the supported srs. As the setter for Spatial reference is not publicly accessible, I am not able to assign it from the outside. There may be some other factors in play here, where I assign the spatial reference system to the map based on my basemap, which may have an impact on the offset I experience. As a user of the WmsLayer class, it appears there is no way of actually using the SupportedSpatialReferenceIDs. I can just see what they are, without a way of affecting what is picked up. A PreferredSpatialReference property would have been nice. That way, the WMS layer can assign the SpatialReference from that, if it is in the SupportedSpatialReferenceIDs, instead of just picking the first available.
... View more
02-20-2014
11:10 PM
|
0
|
0
|
326
|
POST
|
Good catch. Should be fixed with the next version (10.2.2). Thanks for reporting that. I have another related issue where the Initialized event is never raised. Still in the situation with connectivity issues with the internet: Using WmtsLayer/ArcGisTiledLayer (haven't pinpointed which one) never seem to time out, or the timeout is very long. I was wondering if perhaps the layer should give up at some point. Secondly, add a MaximumResolution/MinimumResolution to the OverviewMap so that we can control how far in/out we can show. Sometimes the overview map doesn't really give any overview in rural areas, and looses it's purpose. If Maximum is set, the red square can't shrink out of oblivion 🙂 Perhaps this should have been added to a different post, but I figured I should combine the requests.
... View more
02-20-2014
10:05 PM
|
0
|
0
|
348
|
POST
|
Hi, I'm experiencing a bug with an unhandeled exception using WMS layer. The layer is pointing to an url that returns an invalid result. This causes an unhandled xml exception to occur, interrupting the loading of maps. This also means that the LayersInitialized is not raised. I fixed this in a previous version of the Toolkit.DataSources, and was hoping it would have been fixed in 10.2. The Url I'm testing against is http://www.arcgis.com/sharing/content/items/c2c43e2a7269487785af7942533de9f9/data The url returns a KMZ file, which is fine for the purpose of reproducing the error. I have noticed from time to time that our customers use a WMS service that sometimes returns invalid xml. Of course they should run against a WMS that always returns proper data, but that is outside of our control. Also, the site might be down, they have lost their internet connection through the proxy, or there could be other reasons why the returned data is not valid xml. It would be great if you could fix this issue, so I don't have to build my own version of the toolkit whenever I upgrade 🙂 This is the exception I get. Unhandeled exception System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.Throw(String res, String arg) at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() at System.Xml.XmlTextReaderImpl.ParseDocumentContent() at System.Xml.XmlTextReaderImpl.Read() at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options) at System.Xml.Linq.XDocument.Parse(String text) at ESRI.ArcGIS.Client.Toolkit.DataSources.WmsLayer.client_DownloadStringCompleted(Object sender, DownloadStringCompletedEventArgs e) at System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e) at System.Net.WebClient.DownloadStringOperationCompleted(Object arg) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
... View more
02-20-2014
01:31 AM
|
0
|
2
|
630
|
POST
|
Hi, I have a map in which i have several layers of ArcGIS webservices of different origins. One of them is a WMS service which supports the spatial reference that i am using in my map, but when I look at the spatial reference of this layer it returns the WKID of the first EPSG tag in the WMS file. How can I force it to use my WKID instead ? I just ran into the same problem. Did you find a good solution for this, or did you end up extending the WmsLayer class in the toolkit?
... View more
02-17-2014
11:23 PM
|
0
|
0
|
326
|
POST
|
How do I get to PART_Map? Sorry about the confusion. PART_Map is the Map control itself.
... View more
01-24-2014
11:34 AM
|
0
|
0
|
1082
|
POST
|
Have you tried getting the mouse position relative to the map, and then using ScreenToMap to get the map location, when in the drop event?
var mousePosition = Mouse.GetPosition(PART_Map);
var mapPoint = PART_Map.ScreenToMap(mousePosition);
... View more
01-23-2014
10:59 PM
|
0
|
0
|
1082
|
POST
|
I have been able to identify and resolve the leak. In KmlLayer, introduce the following method private void ClearLayers() { if (ChildLayers.Any()) { foreach (Layer child in ChildLayers.ToList()) { // Fixes memory leak on refresh. Remove individual layers so each layer will be teared down properly by GroupLayer. // ChildLayers.Clear() will cause a reset event, which will not contain NewItems/OldItems so they can be unsubscribed ChildLayers.Remove(child); } } } Replace every call to ChildLayers.Clear() with a call to this method. As mentioned, I am running version 2.3 of the WPF library, so this is something that may have been fixed in ArcGIS Runtime for WPF 10.x.
... View more
06-11-2013
03:16 AM
|
0
|
0
|
433
|
POST
|
Attached example KML source. Local paths are not supported. Exposing this on a web site should take care of it. You may have to update Icon href in TrafficInformation.kml and link href in Refresh Add KmlLayer reference to TrafficInformationRefresh.kml Findings so far: It appears that there may be several causes for the leak, and I may have identified some. Using ANTS memory profiler, I locate the leak to an impressive number of WeakReferences. Tracing their path, they end up in a few possible hotspots. KmlPlaceMakerSymbol and KmlGraphicsLayer. Looking at the kind of connection, it is PropertyChanged event still having a reference to the map. When the KML is parsed, new instances of KmlLayer and KmlGraphicsLayer are created. They subscribe to PropertyChanged and Map.PropertyChanged at some point in their construction and initialization. When the layer is refreshed, ChildLayers.Clear() is called from the main layer, but these PropertyChanged events are never unsubscribed. Both parentLayer (which is the KmlLayer I add to the map), and Map lives on throughout the whole lifetime of the application. I introduced IDisposable to both KmlLayer and KmlGraphicsLayer. Inside of KmlLayer, in every location ChildLayers is called, I instead call a new method named ClearLayers() which will iterate the children and call Dispose before clearing LayerCollection. KmlLayer.Dispose - Unsubscribe Map.PropertyChanged - Iterate and dispose ChildLayers KmlGraphicsLayer.Dispose - OnMapChanged(Map, null) Profiling after making these changes, I still have a memory leak (and memory fragmentation). Now it is KmlPlaceMakerSymbol that is the root of evil. I have not identified what the GC root is now, but it an Object[] related to DataBindings (1 instance). Since my version of ESRI.ArcGIS.Client is 2.3, I do not know what other changes may have been done to the classes in this assembly that may have fixed this leak in later releases. I am building a stripped down version of Toolkit.DataSources to contain only KmlLayer and related classes. LayerCollection should have cleaned up Map.PropertyChanged when cleared (or individual items are removed). Or layers themselves should have unsubscribe implemented when they are removed from the map. This memory leak may also be in effect for other layers as well, but I'm guessing they are not recreated as often as KML services with refresh, so in effect it is probably not something we notice. In the attached screenshot, there is a KmlGraphicsLayer to the right in the path. Of course, there are more paths that hold these references with a high count.
... View more
06-05-2013
12:04 AM
|
0
|
0
|
433
|
POST
|
Hi, I'm currently using the 2.3 version of the library as we haven't been able to update yet (and 2.4 has a bug we can't live with). I reference a few KML Layers that has a refresh interval of 5 minutes. We experience a memory leak that eventually crashes the application with OutOfMemoryException. Tuning the KML file to refresh every 10 seconds will make the application eat memory quite rapidly. I have read through the release notes for later releases, but have not found any resolved issue related to this. Is this memory leak still an issue? If it is, this is a bug report 🙂 I will try to build the Toolkit from http://esrisilverlight.codeplex.com/ with my current version to see if it solves anything, as I assume this is the toolkit that is still being used by version 10.1.1. EDIT: After removing all the classes that doesn't have to do with KML, and some other modifications because of incompatible version of ESRI.ArcGIS.Clients, I have confirmed that the memory leak is still present in the latest version (January, 2013) of the Toolkit. I do not currently have the opportunity to research it and provide a solution. Is this something the ESRI team will look into in the near future?
... View more
06-03-2013
03:48 AM
|
0
|
3
|
3065
|
Title | Kudos | Posted |
---|---|---|
2 | 05-09-2015 09:20 AM | |
1 | 05-09-2015 01:36 PM |
Online Status |
Offline
|
Date Last Visited |
11-11-2020
02:23 AM
|