ThinkGeo.com    |     Documentation    |     Premium Support

WicBitmap is many times slower than GDI+ working with the WorldMapDataKit

We had previously attempted to use the WicBitmapExtension to increase the performance of our application in Aug 6, 2012.  At that time we were still restricted by our customer to running on Win XP as a 32-bit application.  At that time I couldn't get the WicBitmap Extension to work and we concluded it was a limitation of working with Win XP.  Our customer has finally agreed to upgrade our application to Win 7 Pro as a 64-bit application. 


I tried again to get the WicBitmapExtension to work for the DesktopSample (we use the Desktop Edition of MapSuite 6.0 Production Build).  Initially, I was getting the same exception that I was getting in the Win XP environment but I was able to get around the exception by removing the code in the sample that was defining the GeoCanvas for the WinformsMap coming from the resources.  Once I remove the code which was initializing the GeoCanvas from the resource file the sample application will run.


The problem now is that we use the MapSuite WorldMapDataKit as the source for the maps in our application and after adding the WicBitmapGeoCanvas to the application the performance it much, much, much worse.  Before adding the line of code:


winformMap1.GeoCanvas = new WicBitmapGeoCanvas();


it takes between 1-2 sec to initially load and display the WorldMapKitData layers (We still use the code to build and render the map which is nearly the same as the Desktop sample code which is delivered in the WorldMapKitData distribution).  After I add the line of code above it consistently take more than 18 seconds to build and render the same display of the map for the WorldMapDataKit.


Even after the initial display of the WorldMapDataKit, every operation on the map (zooming, panning, etc.) take more than twice as long with WicBitmap included than without.   Note that our application depends heavily on drawing geometric shapes and icons on the map but that I was not drawing any shapes or icons during this testing.  This testing was only using the layers and overlays for the WorldMapKitData.  Each zoom, pan operation was taking 2-4 seconds with WicBitmap compared to 1-2 seconds without.


We expect the performance with WicBitmap to be faster.  The description on the MapSuite web pages said that Direct2D would be up to 50% faster not twice as slow.


Does anyone have any idea why WicBitmap would decrease the perfromance like this?  Our hardware is not the newest and fastest (Dell Optiplex 755) but I believe it should be supporing Direct2D (how can we tell?)


Thanks for any help.


Richard


 


 


 



 Hi Richard,



Actually, compared with GDI+, the WicBitmapCanvas have a much better performance in drawing Lines and polygons, but a bit slower in drawing points, besides it performs much better in multi-threads than GDI+. The attached is a pure demo for performance test we did today, can you try it out and let us know how it performs on your machine? also here is the result we got:


with        wic Point:   35391.4362ms

without wic point:23694.7013ms

with        wic line:4016.1322ms

without wic line:10543.1485ms

with        wic polygon:11988.3431ms

without wic polygon: 23936.6154ms


 The result above also shows drawing polygons and lines performs better using Wic, but worse when drawing points. All these tests are based on single thread.


Also we tested the worldMapKit on our end, seems like we didn’t get an obvious performance change after switching to WIC, I guess there are 2 major reasons: 


1.       For worldMapKit, most of the data are line or polygon.


2.       As far as we tested before, most of the time is consumed by the querying feature, rather than drawing.


Please check the attached test demo and let us know what you get, also can you let us know your OS configuration and hardware configuration? So that we can get a similar machine for test.


 


Thanks,


Johnny



Post_11131Sample.txt (2.2 KB)

Johnny, 



Thanks for the quick response. I appreciate your efforts to give us great support. 



My computer configuration is as follows: 

Computer: Dell Optiplex 755 desktop 

Processor: Intel Core2 Duo CPU E6750 @ 2.66GHz 

Memory: 4.00 GB 

Video card: Intel GMA 3100, Intel Q35 Express Chipset Family 

Disk Drive: ST380815AS ATA Device 

Disk Drive: WDC WD2500AAJS-00YZCA0 ATA Device 



OS: Windows 7 Professional Service Pack 1 64-bit Operating System 



I ran your sample code for Point, Line, and Polygon. My times came out considerable higher but in the same proportion as the times you showed. 



GeoCanvas=WicBitmap - Point:107926.8785 ms 

GeoCanvas=GDI+ - Point:37276.2064 ms 



GeoCanvas=WicBitmap - Line:11688.4214 ms 

GeoCanvas=GDI+ - Line:16360.9432 ms 



GeoCanvas=WicBitmap - PolyGon:26484.6281 ms 

GeoCanvas=GDI+ - PolyGon:35920.5178 ms 



GeoCanvas=WicBitmap - WorldkMapKit: 42717.8432 ms 

GeoCanvas=GDI+ - WorldkMapKit: 1371.9292 ms 



GeoCanvas=WicBitmap - WorldkMapKit: 39059.8633 ms 

GeoCanvas=GDI+ - WorldkMapKit: 1333.2718 ms 



GeoCanvas=WicBitmap - WorldkMapKit: 39288.7545 ms 

GeoCanvas=GDI+ - WorldkMapKit: 1324.4616 ms 



GeoCanvas=WicBitmap - WorldkMapKit: 39600.8305 ms 

GeoCanvas=GDI+ - WorldkMapKit: 1327.5998 ms 



GeoCanvas=WicBitmap - WorldkMapKit: 38884.8724 ms 

GeoCanvas=GDI+ - WorldkMapKit: 1338.4238 ms 



After the Point, Line, Polygon test, I updated the WorldMapKitSample.cs from the CSDesktopEditionSample in the WorldMapKitSDK with the "Stopwatch" code around the "Map.Refresh()" in the "FormRenderUSA_Load" method. I ran it five times with the original code GeoCanvas and then five times with GeoCanvas set to WiciBitmapGeoCanvas. As you can see using the same layers from the WorldMapKitData, the times for WicBitmap are around 39 seconds while the times for the GDI+ are around 1.3 seconds. 



I captured the screens for the WorldMapKitData application and I will attempt to attach it to this reply. The screen capture do not indicate why the times are so drastically different. They actually show that indivudual layers are relatively comparable between GDI+ and WicBitmap. Therefore, I am still at a loss as to why WicBitmap is so much slower. It is probably true that most of the time is consumed by the querying feature rather than drawing but why would the querying feature so much diffferent for GDI+ vs. WicBitmap. Given the times for Point, Line, and Polygon compared to the WorldMapKitData times, I have to assume that the WorldMapKitData is processed as "Point" data more than "Line" or "Polygon". 



Richard 



 



Hi Richard,
 
You can use the following code to optimize the speed.
 

        private void FormRenderUSA_Load(object sender, EventArgs e)
        {
            ………
            Map.GeoCanvas = new MyWicCanvas();
            MyWicCanvas.layerCount = worldMapKitRenderLayer.StaticLayers.Count + worldMapKitRenderLayer.DynamicLayers.Count;
            ……….
        }
        
        [Serializable]
       public class MyWicCanvas : WicBitmapGeoCanvas
        {
           public static int layerCount = 0;
           public static int layerCounter = 0;
            protected override void EndDrawingCore()
            {
                if (layerCounter == layerCount+2)
                { base.EndDrawingCore(); }
                layerCounter++;
            }
        }


 
Regards,
Edgar

Edgar, 
  
 Thanks for the sample code. 
  
 I tried inserting it into the WorldMapKitSample.cs.  The DesktopEdition WorldMapKitSample window now appears very quicky similar to the screen shot shown in the previous reply above where it shows the panel with the timing for each of the layers. However the map panel in the window is just white.  If I click and drag in the map panel, I can get a map outline to display once and then it is gone again (just a white panel remains) for all the zoom and pan operations. The map outline that displays does not show any labels for cities or any other detail - just a basic map outline. 
  
 If there a particular place where the "MyWicCanvas" should be instantiated and where the layerCount should be updated?.   I inserted the code below the WorldMapKitRenderLayerOverlay was created and just before the Map.Refresh() call.  Also, does the WicBitmapExtension DLL work with the 6.0.0.??? Production Build of DesktopEdition or will it only work with the 6.0.xxx.0 Development Builds?  I am currently testing with Production Build 6.0.0.311 and Development Build 6.0.311.0.  
  
 Thanks 
  
 Richard 
  


Hello Richard,


Sorry for your inconvenience, Would you please change 

 public class MyWicCanvas : WicBitmapGeoCanvas
        {
           public static int layerCount = 0;
           public static int layerCounter = 0;
            protected override void EndDrawingCore()
            {
                if (layerCounter == layerCount+2)
                { base.EndDrawingCore(); }
                layerCounter++;
            }
        }

To

        [Serializable]
       public class MyWicCanvas : WicBitmapGeoCanvas
        {
            public static int layerCount = 0;
           public static int layerCounter = 0;
 
            protected override void EndDrawingCore()
            {
                if (layerCounter >= layerCount)
                {
                    base.EndDrawingCore();
                    layerCounter = 0;
                }
                layerCounter++;
            }
        }

Please feel free to let us know your queries.
 
Regards,
 
Gary
 

Gary, 
  
 Thanks for the improved code.   The DesktopSample now shows a map on most operations although it still frequestly shows just a white panel.  For example I can zoom in and the map displays but if I pan (left, right, up, down) the panel goes white.   Also I still do not see labels i.e. no cities, roads name or steet names on the US map.   
  
 I haven’t really checked the speed of the MyWicCanvas.   It is much faster than just using WicBitmapGeoCanvas directly.  I am not sure how it compares with GDI+. 
  
 Thanks again. 
  
 Richard

 Hi Richard,


 
Sorry for the inconvenience, we have made a mistake in previous post, now the following code should work.

 public class MyWicCanvas : WicBitmapGeoCanvas
        {
            public static int layerCount = 0;
           public static int layerCounter = 0;
            protected override void EndDrawingCore()
            {
                if (layerCounter >= layerCount+2)
                {
                    base.EndDrawingCore();
                    layerCounter = 0;
                }
                layerCounter++;
            }
        }

About panel goes white, I the white part will be drawn after you release the dragging.
Here is a link of our test video: screencast.com/t/kclkEZk2Qb
 
About no roads name and street name, there are two potential reasons, the first is the “ RenderLabelLayer("cities_c2");” 
is not added in “loadlayers()” inWorldMapKitRenderLayer.cs; the second is when setting “layer.ZoomLevelSet.ZoomLevel0X.ApplyUntilZoomLevel= ApplyUntilZoomLevel.Level0Y” the range of X-Y is too small, so if current zoomlevel is out of the range from X-Y, the layer will not be drawn.
 
Hope it helps
 
Gary
 

Gary, 
  
 Thanks again for the code. 
  
 I tried it in the sample code and I really don’t see much difference than the previous samples.  About half of the time I do not see anything but a white panel.   I looked at the sample video link you provided and that is not at all what I am referring to as a white panel.  It isn’t just a part of the panel that is white which is then painted when the “dragging” is released.   The entire panel top to bottom and right to left is completely white with no map displayed at all. It does not refresh on it own (when the dragging is complete).  It occurs both when I try an operation with “dragging” and when I use the buttons in the tool bar to zoom or pan.   I do not believe it has anything to do with dragging. 
  
 Also, I do not see why the missing labels would be related to the zoom level.  When I run the original code for the DesktopEdition sample  the labels are there and visible at all the zoom levels.  All I have done is add the reference to the WicBitmapExtension and inserted the code to instantiate the MyWicBitmap for the GeoCanvas.  I have not changed any of the zoom levels from the original code.  When the canvas is set to the MyWicBitmap there are no labels at any zoom level.  I can comment out the instantiation of the MyWicBitmap to revert the GeoCanvas back to the original code and the labels will be there again at all zoom levels.   The code the “loadLayers()” is the same when I run with “MyWicBitmap” as when I run without it.  If I need to redefine the ZoomLevels in order to work with MyWicBitmap, could you be more specific of the changes required? 
  
 It sounds as though the sample code you provided must be working much differently in your environment.  Is there anything I need to verify about the environment that I am using?  I have just upgraded to Windows 7 Professional 64-bit.  I am using Visual Studio 2010 SP1.  Both of these are as they come directly from Microsoft with the addtion of all the current Security updates.   I have not installed any special “Direct 2d” addtion if there are any such things.    
 I am running the sample using MapSuite DesktopEdition 6.0.311.0 and 6.0.0.311.  These are Production builds of the Desktop Edition software  (I do not currently have any “Evaluation” MapSuite software).  The WicBitmapExtension.dll is version 6.0.311.0 (it does not seem to be available with 6.0.0.311).  The WorldMapKitData and sample code was the release Version 5.0 World Map KIt SDK with a date of 9/1/2011 on the DVD label.   I believe there has been an upgraded release of the World Map Kit SDK within the past year but we have not recieved it.   Do we need to add or upgrade anything in Windows 7 or Visual Studio?   Do we need to have the upgrade version of WorldMapKit SDK?

Hi Richard, 
  
 It’s really weird for us, could you send your sample to forumsupport@thinkgeo.com, we will have a test on a clean machine. 
  
 Thanks, 
 Johnny

I've attempted to zip the CSDesktopEditionSample directory and added as an attachment.   The application is still mostly the same as it came on the delivered World Map Kit SDK.  The only changes are the addition of the code to include the MyWicBitmap class and the code to point the directory for the World Map Kit Data to the local drive where the World Map Kit is installed. 


If this zip file is not accessable, please let me know and I'll try to upload just the changed *.cs and *.csproj files.


Thanks


Richard



CSDesktopEditionSample.zip (1.78 MB)

 Hi Richard,


 
We have recreated the label-missing issue, we did some change in “DrawCore()” method in “WorldMapKitRenderLayer.cs” to fix it. But I don’t know if this fix the panel white issue because we didn’t recreate the white pannel. Would you please try the sample attached to check it out?
 
Hope it helps
 
Gary
 

001_CSDesktopEditionSample.zip (47.5 KB)

Gary, 
  
 Thanks again for the code samples. 
  
 This seem to be partially successful.  They labels look much better and the white panels may be fixed.  However, the sample app now crashes after zooming in to a zoom level where city streets start to become detailed.  It crashes in the WorldMapKitrenderLayer.cs on line 3061. It is processing the “layer.Draw(canvas, lablelIinAllLayers);” in the foreach loop for the dynamicLayers.   The error message is “ArgumentException was unhandled by user code.  24144: This operation cannot be completed because the instance is not valid.  Use MakeValid to convert the instance to a valid instance.  Note that MakeValid may cause the points of a geometry instance to shift slightly.”  The Stack trace is "at Microsoft.SqlServer.Types.SqlGeometry.ThrowIfValid() and a lot more.  I haven’t tried a try-catch block in the DrawCore.   I will do that if I get a chance but I don’t believe it will prevent the error - just allow the code to continue past the exception. 
  
 Richard

Hi Richard, 
  
 Would you please change BaseShape.GeometryLibrary = GeometryLibrary.Default in “FormRenderUSA_Load()” in “WorldMapKitSample.cs”  
 To 
 BaseShape.GeometryLibrary = GeometryLibrary.Managed; 
 This should solve the problem. 
  
 When using BaseShape.GeometryLibrary = GeometryLibrary.Managed, we use the NTS to check the data validation 
 When using BaseShape.GeometryLibrary = GeometryLibrary.Unmanaged or BaseShape.GeometryLibrary = GeometryLibrary.Defualt, we use the Sqltype  to check the data validation 
 As NTS and Sqltype have different validation-checking mechanism, some data will not pass SqlType validation check and the exception will be thrown. 
 In the future we will updata the data to Achieve GeometryLibrary.Unmanaged. 
  
 Hope it helps 
  
 Gary 


Thanks Gary. 
  
 That works much better.  It seems to be running fairly well now. 
  
 It seems that the font sizes are smaller with WicBitmap.  With the old GeoCanvas the labels appeared slightly larger.  Once I switch to the WicBitmap the labels at each zoomLevel seem to be a little smaller.   The font appearance is slightly different as well.   Is this the expected behavior? 
  
 Richard

Hi Richard, 
  
 Yes, this is the expected behavior, the font size is a little smaller in Wic than GDI+, if you have any questions please let us know. 
  
 Regards, 
  
 Edgar