ThinkGeo.com    |     Documentation    |     Premium Support

Draw layer time

Hi,


Used the function to get the amount of time to draw each layer:


layer.DrawingTime.Milliseconds


but when adding up all the layers draw time it doesn't match the time it takes to process the draw function


e.g.

LAYER1 TIME:            0

LAYER2 TIME:        0

LAYER3 TIME:            11

LAYER4 TIME:      15

LAYER5 TIME:            33

LAYER6 TIME:      57

LAYER7 TIME:           83

LAYER8 TIME:        26

LAYER9 TIME:            4

LAYER10 TIME:         52

LAYER11 TIME:    41

LAYER12 TIME:           56

LAYER13 TIME:           0

LAYER14 TIME:           0

LAYER15 TIME:      0

LAYER16 TIME:           933

LAYER17 TIME:       0

LAYER18 TIME:          616

LAYER19 TIME:          194

LAYER20 TIME:      0

Total time spend from timer is 00:00:06.4998336


code is like this:

pEngine.OpenAllLayers();

DateTime startTime1 = DateTime.Now;

DateTime stopTime1 = DateTime.Now;

pEngine.DrawStaticLayers(bitmap, GeographyUnit.Meter);

stopTime1 = DateTime.Now;

PrintLayerDrawTime(); //print out each draw time for each layer

TimeSpan duration1 = stopTime1 - startTime1;

Console.WriteLine("Total time spend from timer is " + duration1.ToString());




so is there some overhead that is not store in the drawtime of each layer?


Thanks


Paul

 



Hi, Paul 
  
 Yes, there are some extra expense if you use the MapEngine to render your map image. 
  
 The DrawingTime property is used to get the last drawing time for the layer, and that means it only count the time for the "Draw" method, but, for "DrawStaticLayers" method, the time cost for it contains the DrawingTime for each layer and it will do some extra initialzing stuff, such as initializing the GeoCanvas, setting up the environment and also it will draw the logo by default. 
  
 If you have any doubts about it, please let us know. 
  
 Thanks, 
  
 Khalil

does my processing time look right? total process time is about 6 secs where the drawing of each layer is around 2 - 3 seconds.


so the overhead is around addition 3 - 4 secs...


 


Thanks


 


Paul



 


Hi Paul,
Yes, I think your way is right, but the overhead should contain the time for opening layers. Additionally, the StopWatch will be much better.
Thanks,
Johnny

Guys, 
  
   Johnny: The layer drawing time should not include the open time for the layer.  This is not drawing specially and what we are looking for the the drawing time is the time it spend drawing for that layer assuming that the layer is open. 
  
   Paul: The overhead that Khalil mentioned as with creating the geocanvas is very little and should not impact the overall numbers.  The main overhead if the opening of the layers as it creates file streams with caches etc.  You only need to do this once and then you can re-use the already open layers. From your example you open the layers first so this should not count.  The 3-4 seconds overhead is VERY strange.  Are you doing any tile caching, projection, etc that we should know about?  If not let me know and we will do a test here with a group of layers. 
  
 David

No... not tiling or caching in that request the time you saw it's actuall from the draw function.


I'm just doing a single image request for this example.


Thanks


Paul



here is another capture… 
 LAYER1 TIME:            0 
 LAYER2 TIME:        0 
 LAYER3 TIME:            0 
 LAYER4 TIME:      0 
 LAYER5 TIME:            0 
 LAYER6 TIME:      501 
 LAYER7 TIME:           0 
 LAYER8 TIME:        837 
 LAYER9 TIME:            120 
 LAYER10 TIME:         0 
 LAYER11 TIME:    987 
 LAYER12 TIME:           0 
 LAYER13 TIME:           542 
 LAYER14 TIME:           0 
 LAYER15 TIME:      0 
 LAYER16 TIME:           0 
 LAYER17 TIME:       0 
 LAYER18 TIME:          616 
 LAYER19 TIME:          194 
 LAYER20 TIME:      0 
 Total time spend from timer is 00:00:37.9904525

 


Hi Paul,
Almost 38 seconds overhead is very strange if you didn’t do any projection or tile caching. Can you let us know the style setting of these layers? Additionally, Can you let us know the size of shape file for Layer 6, 8, 9, 11, 13, 18, 194 or the record count?
Thanks,
Johnny

all are multishapefilelayers 
  
 layer 6 is using: (total 5.27 MB) 
 TextStyles.Water1(“NAME”) 
  
 layer 8 is using:  (total 23.1 MB) 
 AreaStyle with FillCustomBrush color 
  
 layer 9 is using: (total 42.6 MB) 
 regexStyle with 13 RegexItems 
  
 layer 11 is using: (total 237 MB) 
 AreaStyle with FillCustomBrush color 
  
 layer 13 is using: (total 25.6 MB) 
 AreaStyle with FillCustomBrush color 
  
 sorry layer 18 and 19 is a copy and past problem; those layer shouldn’t be there. 
  
 and the total time for the whole draw is 00:00:37.9904525 
  
 so we’re looking around  
 37.9904525 secs - 2.986 secs = 35.0044525 secs overhead.

 


Paul,
I think 987 ms for Layer11 is reasonable, because it’s 237 MB. But a little strange for Layer8 (837 ms), it’s just 23.1 MB. Thanks for your response and we will do a test with a similar scenario.
Thanks,
Johnny

Hi Paul,


The drawing time can be divided into two parts: fetching data and drawing data.
The time for fetching data can be evaluated from API:
Collection<Feature> features = featureSource.GetFeaturesForDrawing(marginWorldExtent, canvas.Width, canvas.Height, columnNames);
The drawing time can be retrieved from API:
currentZoomLevel.Draw(canvas, features, labeledFeatures, labelsInAllLayers);
Can you let us know which time is taking the major factor of the performance? If it’s the fetching data stage, can you send us a sample data for our further investigation, maybe there are some very large polygons taking most of the time and it’s hard for us to fix it now.
If drawing time takes most of the part, can you try changing the styles to see whether there is any boost?
Thanks,
Johnny
 

here is another example: 
  
 using another smaller set of datas but with more layer 
  
 still total draw time is around 9.5 secs when the total added draw time is 2.6 secs 
  
 the “LayerX Open:” is not included in the above draw time calculation. and uses featureSource.GetFeaturesForDrawing() 
 the “LayerX TIME:” is using the DrawingTime.Milliseconds assuming it’s same as currentZoomLevel.Draw() 
  
 LAYER1 TIME:       0 
 LAYER1 Open:       00:00:00 
 LAYER2 TIME:       0 
 LAYER2 Open:       00:00:00 
 LAYER3 TIME:       19 
 LAYER3 Open:       00:00:00 
 LAYER4 TIME:       28 
 LAYER4 Open:       00:00:00 
 LAYER5 TIME:       171 
 LAYER5 Open:       00:00:00.0156246 
 LAYER6 TIME:       74 
 LAYER6 Open:       00:00:00.0156246 
 LAYER7 TIME:       219 
 LAYER7 Open:       00:00:00.0156246 <—ocean layer with label 1.3MB size (using define style oceantextStyle & waterStyle see below) 
 LAYER8 TIME:       0 
 LAYER8 Open:       00:00:00.0156246 
 LAYER9 TIME:       16 
 LAYER9 Open:       00:00:00 
 LAYER10 TIME:      84 
 LAYER10 Open:      00:00:00.0312492 
 LAYER11 TIME:      73 
 LAYER11 Open:      00:00:00.0156246 
 LAYER12 TIME:      39 
 LAYER12 Open:      00:00:00.0156246 
 LAYER13 TIME:      118 
 LAYER13 Open:      00:00:00.0156246 
 LAYER14 TIME:      0 
 LAYER14 Open:      00:00:00 
 LAYER15 TIME:      0 
 LAYER15 Open:      00:00:19.8744912 <—using ValueStyle of 1 customStyle (street) of 310MB size 
 LAYER16 TIME:      0 
 LAYER16 Open:      00:00:18.9213906 <— street label layer of 310MB size (using define text style sttextStyle see below) 
 LAYER17 TIME:      878 
 LAYER17 Open:      00:00:00.4062396 <— using ValueStyle of 1 customStyle (secondary hwy) 51MB Size 
 LAYER18 TIME:      180 
 LAYER18 Open:      00:00:00.8437284  <— secondary hwy label layer 51MB size (using define text style hwytextStyle see below) 
 LAYER19 TIME:      794 
 LAYER19 Open:      00:00:00.0312492 <— using ValueStyle of 2 customStyle (hwy + hwy label) 18MB size 
 LAYER20 TIME:      0 
 LAYER20 Open:      00:00:00.1093722 
 10/8/2010 09:28:36.4505801: (DBG) Just DATA - 00:00:09.4841322 
  
  
 hwytextStyle = TextStyles.Highway1(HWY_NAME); 
 hwytextStyle.TextLineSegmentRatio = 95; 
 hwytextStyle.FittingLineInScreen = true; 
 hwytextStyle.TextSolidBrush.Color = GeoColor.SimpleColors.Black; 
 hwytextStyle.Font = new GeoFont(“Arial”, 8); 
 hwytextStyle.SuppressPartialLabels = true; 
 hwytextStyle.SplineType = SplineType.StandardSplining; 
 hwytextStyle.BestPlacement = true; 
 hwytextStyle.FittingPolygon = true; 
 hwytextStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping; 
 hwytextStyle.DuplicateRule = LabelDuplicateRule.NoDuplicateLabels; 
  
 sttextStyle = TextStyles.LocalRoad1(STREET_COL_NM); 
 sttextStyle.TextLineSegmentRatio = double.MaxValue; 
 sttextStyle.SplineType = SplineType.StandardSplining; 
 sttextStyle.Font = new GeoFont(“Arial”, 7); 
 sttextStyle.AllowLineCarriage = true; 
 sttextStyle.BestPlacement = true; 
 sttextStyle.FittingPolygon = true; 
 sttextStyle.SuppressPartialLabels = true; 
 sttextStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping; 
 sttextStyle.DuplicateRule = LabelDuplicateRule.NoDuplicateLabels; 
 sttextStyle.FittingLineInScreen = true; 
  
 oceantextStyle = TextStyles.Water1(OCEAN_NAME); 
 oceantextStyle.BestPlacement = true; 
 oceantextStyle.FittingPolygon = true; 
 oceantextStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping; 
 oceantextStyle.DuplicateRule = LabelDuplicateRule.NoDuplicateLabels; 
  
 waterStyle = new AreaStyle(); 
 waterStyle.Advanced.FillCustomBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 148, 181, 214));

Paul,


Thanks for your post and patience.
One thing I am not very sure about the result is the time for the TIME is in milliseconds, and the time for the Open is in also in seconds?
From the result, the majority time is spent to fetch data from shape file, this always indicts the polygon is too complex to take much time to read.  For example, Layer15 and Layer16 take almost 20 secs to fetch data, could you loop each feature on the returning drawing features to see its complexity by watch how many vertices is contained.
General speaking, the labeling time will be slower than the shape rendering time, and the polygon rendering time will also be much worsen with the increase of the complexity of polygon.
Thanks.
Yale