ThinkGeo.com    |     Documentation    |     Premium Support

Exception when running WpfDesktopSample of D2D map feature

 Hi,


I've downloaded the sample apps that accompany new D2D map feature but get the following runtime exception: 



System.TypeInitializationException was unhandled

  Message=The type initializer for 'ThinkGeo.MapSuite.Core.WicBitmapGeoCanvas' threw an exception.

  Source=WicBitmapExtension

  TypeName=ThinkGeo.MapSuite.Core.WicBitmapGeoCanvas

  StackTrace:

       at ThinkGeo.MapSuite.Core.WicBitmapGeoCanvas..ctor()

       at ThinkGeo.MapSuite.WpfDesktopEdition.WicBitmapLayerOverlay.DrawTileCore(Tile tile, RectangleShape targetExtent)

       at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.DrawTile(Tile tile, RectangleShape targetExtent)

       at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.txU=(RectangleShape uhU=, OverlayRefreshType uxU=, Boolean vBU=)

       at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.txU=(RectangleShape uBU=, OverlayRefreshType uRU=)

       at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.DrawCore(RectangleShape targetExtent, OverlayRefreshType overlayRefreshType)

       at ThinkGeo.MapSuite.WpfDesktopEdition.LayerOverlay.DrawCore(RectangleShape targetExtent, OverlayRefreshType refreshType)

       at ThinkGeo.MapSuite.WpfDesktopEdition.Overlay.Draw(RectangleShape targetExtent, OverlayRefreshType refreshType)

       at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.EBQ=(Overlay ExQ=, RectangleShape FBQ=, OverlayRefreshType FRQ=)

       at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.CBQ=(IEnumerable`1 DRQ=, RectangleShape DhQ=, OverlayRefreshType DxQ=)

       at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.CBQ=(RectangleShape CRQ=, OverlayRefreshType ChQ=)

       at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.DrawCore(RectangleShape targetExtent, OverlayRefreshType overlayRefreshType)

       at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.Draw(RectangleShape targetExtent, OverlayRefreshType refreshType)

       at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.9BM=(RectangleShape 9RM=)

       at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.ABQ=(Object ARQ=, EventArgs AhQ=)

       at System.Windows.Threading.DispatcherTimer.FireTick(Object unused)

       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)

       at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

       at System.Windows.Threading.DispatcherOperation.InvokeImpl()

       at System.Threading.ExecutionContext.runTryCode(Object userData)

       at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)

       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)

       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

       at System.Windows.Threading.DispatcherOperation.Invoke()

       at System.Windows.Threading.Dispatcher.ProcessQueue()

       at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)

       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)

       at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

       at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)

       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)

       at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)

       at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)

       at System.Windows.Application.RunInternal(Window window)

       at System.Windows.Application.Run()

       at WicBitmapGeoCanvasSamples.App.Main() in C:\Tools\ThinkGeo-WpfMap-Direct2d\WicBitmap Extension Package\Samples\WicBitmapGeoCanvasSamples\WpfDesktopSample\obj\Debug\App.g.cs:line 0

       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)

       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)

       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

       at System.Threading.ThreadHelper.ThreadStart()

  InnerException: System.NotSupportedException

       Message=An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See go.microsoft.com/fwlink/?LinkId=155569 for more information.

       Source=mscorlib

       StackTrace:

            at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence)

            at System.Reflection.Assembly.LoadFile(String path)

            at ThinkGeo.MapSuite.Core.WicBitmapGeoCanvas..cctor()

       InnerException: 


I've reference the 5.5.0.153 MapSuiteCore.dll and WpfDesktopEdition.dll.


I'm referencing the WicBitmapExtension.dll that was supplied with the MapSuiteWicBitmapExtension2011-11-24.zip


I also followed the directions in the readme and have the WindowsApiCodePackx64 and WindowsApiCodePackx86 in my c:\Windows\SysWOW64\Map Suite 5.5 directory.


Please help.


Thanks,


Josh


 



Hi Josh,  
  
 Thanks for your question. Based on your exception the only item that ‘stands out’ is the ‘Message=An attempt was made to load an assembly from a network location’. Are you running something here from a network location that you application does not have permissions to access?

Hi Josh,  
  
 Thanks for your question. Based on your exception the only item that ‘stands out’ is the ‘Message=An attempt was made to load an assembly from a network location’. Are you running something here from a network location that you application does not have permission to access?

Hi Ryan, 
  
 That’s a good question and what I originally thought when I tried to use the new bits in my application.  So I thought I’d eliminate my code and use the sample application that ThinkGeo provided.  I get the same exception.  Is there anything in the sample application that’s trying to reference something remote?  Could there be a problem with my installation of the ThinkGeo assemblies?  How should I go about completely removing the bits and re-installing? 
  
 Thanks! 
 Josh

Can anyone from ThinkGeo answer the question above? 
  
 Thanks, 
 Marat

Hi, 
  
 I downloaded MapSuite version 6.0.0.0. and would like to try the D2D, but can’t find the WicBitmapExtension.dll.  All the links that I was able to locate point to the MapSuiteWicBitmapExtension2011-11-24.zip - wiki.thinkgeo.com/wiki/File:MapSuiteWicBitmapExtension2011-11-24.zip.  Do you have an equivalent download for version 6.0.0.0 of Mapsuite? 
  
 Thank you, 
 Marat 


Marat & Josh,


Please visit the wiki.thinkgeo.com/wiki/File:...-05-30.zip to get the 6.0 dll and have a try, We tested with the dlls, it works fine.


Thanks,


Johnny



Johny,  
  
 Thank you for the response.  I downloaded zip file and it works fine.   
  
 Can you please provide a sample app that demonstrates WicBitmapGeoCanvas, GeoImage with DrawCore / DrawScreenImageWithoutScaling methods for Direct2D? 
 I am having trouble figuring out how GeoImage works. 
  
 Thanks, 
 Marat

Johny, 



I am exploring the performance of the new Direct2D drawing mode(via WicBitmapLayerOverlay) and  I am using  DrawWorldImageWithoutScaling method of WicBitmapGeoCanvas in DrawCore method.  Is there any good documentation on WicBitmapGeoCanvas? What I should set RenderMode for EditOverLay?


I am attaching sample apps, Performance1.zip uses your new Direct2D API and Performance2.zip uses regular non Direct2D APIs.  I used Performance Profiling Tools For WPF and Process Explorer from Sysinterals to measure the performance of the sample apps Performance1.zip and Performanc2.zip (usage of the GPU and CPU).  After launching the app, I zoomed in and out continously. Application CPU usage spikes up and GPU usage is the same for non Direct2D version of the sample application as Direct2D.  Increasing the number of Point objects makes Performance1.zip app much slower then Performance2.zip. Could you please advise on what I need to do to take the advantage of the 50% performance boost from new Direct2D API? Did I miss something in the new API or using it incorrectly?


Here are the graphics card and other information:


1) RenderCapability.Tier  is 2 (using the following code int renderingTier = (RenderCapability.Tier >> 16))


2) DirectX Version: DirectX11


---------------

Display Devices

---------------

          Card name: NVIDIA Quadro NVS 295

       Manufacturer: NVIDIA

          Chip type: Quadro NVS 295

           DAC type: Integrated RAMDAC

         Device Key: Enum\PCI\VEN_10DE&DEV_06FD&SUBSYS_062E10DE&REV_A1

     Display Memory: 3053 MB

   Dedicated Memory: 238 MB

      Shared Memory: 2814 MB

       Current Mode: 1920 x 1080 (32 bit) (60Hz)

       Monitor Name: Dell P2211H (Digital)

      Monitor Model: DELL P2211H

         Monitor Id: DEL4061

        Native Mode: 1920 x 1080(p) (60.000Hz)

        Output Type: DVI

        Driver Name: nvd3dumx.dll,nvwgf2umx.dll,nvwgf2umx.dll,nvd3dum,nvwgf2um,nvwgf2um

Driver File Version: 8.16.0011.9175 (English)

     Driver Version: 8.16.11.9175

        DDI Version: 10

       Driver Model: WDDM 1.1

  Driver Attributes: Final Retail

   Driver Date/Size: 2/1/2010 16:38:10, 9457256 bytes

        WHQL Logo'd: n/a

    WHQL Date Stamp: n/a

  Device Identifier: {D7B71E3E-45BD-11CF-B950-25261EC2C535}

          Vendor ID: 0x10DE

          Device ID: 0x06FD

          SubSys ID: 0x062E10DE

        Revision ID: 0x00A1

 Driver Strong Name: oem4.inf:NVIDIA_SetA_Devices.NTamd64.6.1:Section003:8.16.11.9175:pci\ven_10de&dev_06fd&subsys_062e10de

     Rank Of Driver: 00E60001

        Video Accel: ModeMPEG2_A ModeMPEG2_C ModeVC1_C ModeWMV9_C 

   Deinterlace Caps: {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(YUY2,YUY2) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY DeinterlaceTech_PixelAdaptive 

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(YUY2,YUY2) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY 

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(YUY2,YUY2) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY 

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(YUY2,YUY2) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY DeinterlaceTech_BOBVerticalStretch 

                     {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(UYVY,UYVY) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY DeinterlaceTech_PixelAdaptive 

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(UYVY,UYVY) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY 

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(UYVY,UYVY) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY 

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(UYVY,UYVY) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY DeinterlaceTech_BOBVerticalStretch 

                     {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(YV12,0x32315659) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY DeinterlaceTech_PixelAdaptive 

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(YV12,0x32315659) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY 

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(YV12,0x32315659) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY 

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(YV12,0x32315659) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY DeinterlaceTech_BOBVerticalStretch 

                     {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(NV12,0x3231564e) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY DeinterlaceTech_PixelAdaptive 

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(NV12,0x3231564e) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY 

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(NV12,0x3231564e) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY 

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(NV12,0x3231564e) Frames(Prev/Fwd/Back)=(0,0,0) Caps=VideoProcess_YUV2RGB VideoProcess_StretchX VideoProcess_StretchY DeinterlaceTech_BOBVerticalStretch 

                     {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(IMC1,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(IMC1,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(IMC1,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(IMC1,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(IMC2,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(IMC2,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(IMC2,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(IMC2,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(IMC3,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(IMC3,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(IMC3,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(IMC3,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(IMC4,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(IMC4,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(IMC4,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(IMC4,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(S340,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(S340,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(S340,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(S340,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {6CB69578-7617-4637-91E5-1C02DB810285}: Format(In/Out)=(S342,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {F9F19DA5-3B09-4B2F-9D89-C64753E3EAAB}: Format(In/Out)=(S342,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {5A54A0C9-C7EC-4BD9-8EDE-F3C75DC4393B}: Format(In/Out)=(S342,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

                     {335AA36E-7884-43A4-9C91-7F87FAF3E37E}: Format(In/Out)=(S342,UNKNOWN) Frames(Prev/Fwd/Back)=(0,0,0) Caps=

       D3D9 Overlay: Supported

            DXVA-HD: Supported

       DDraw Status: Enabled

         D3D Status: Enabled

         AGP Status: Enabled


3) Tried changing the following registry key to the value of 0 to force hardware acceleration:


HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration   




Thank you, 

Marat



Performance1.zip (12.3 KB)
Performance2.zip (17.2 KB)

Can anyone respond from ThinkGeo please? 
  
 Thanks, 
 Marat

Hello Marat, 
  
 Sorry for delay, Johnny will answer your questions on Monday morning. 
  
 Sorry for the inconvenience. 
  
 Regard, 
  
 Gary

Gary, 
  
 Can anyone from ThinkGeo answer my questions above? 
  
 Thank you, 
 Marat

 Hi Marat,


 
Sorry for the delay, I got this post this afternoon and I'm here to give you some information and background on the WIC performance; our WICBitmapGeoCanvas is actually using WIC (Windows Imaging Component),
 


        
  1. We used to test the CompatibleBitmap, DCRender, HwndRenderTarget and WICBitmap; but at last, we chose WICBitmap, for it’s the only one which is compatible with our GeoCanvas, and it’s only one can convert to GDI+ bitmap with alpha channel. 

         

  2.     
  3. The advantage drawing image with WIC is that it doesn’t have lock in while drawing, so it will be faster while drawing geometries together.

         

  4.     
  5. The Windows Imaging Component introduced an extensible framework for working with images and image metadata. The image formats supported by Windows Imaging Component include JPEG, PNG, and TIFF, and the supported metadata formats include XMP and EXIF. With Windows 7, Windows Imaging Component broadens its standards compliance by providing support for progressive image decoding, expanded PNG features, GIFmetadata, and metadata that spans APPn segments.

         

  6.     
  7. The GDI+ is also built on top of WIC, although GDI+ will not load 3rd-party or external codecs. So the drawing speed will not be a big performance enhancement when drawing in a single thread. On the other hand, WPFDesktop draws in multithread, and it renders faster than the original way sometimes.

         

  8.     
  9. The drawing speed is actually very fast even if we don’t have hardware accelerate; the reason what causes the performance issue the disk reading speed, we also have some other advice on speed the performance up; such as caching, simplify the area etc.


 
Hope it helps and let me know if you have any questions. We will keep looking into your code and see if we have any suggestion on improve the performance issue.
 
Thanks,
Howard

Howard,


Thank you for your response.  As per your suggestion I simplified the sample app's DrawCore method, Performance1 still slower repainting the screen.


//Performance1


   protected override void DrawCore(IEnumerable<feature></feature> features, GeoCanvas canvas, Collection<simplecandidate></simplecandidate> labelsInThisLayer,

                                         Collection<simplecandidate></simplecandidate> labelsInAllLayers)

        {

            base.DrawCore(features, canvas, labelsInThisLayer, labelsInAllLayers);



            var gcanvas = canvas as WicBitmapGeoCanvas;

            if (gcanvas == null) return;



            gcanvas.DrawingQuality = DrawingQuality.HighSpeed;



            foreach (var pointShape in features.Select(feature => feature.Tag).OfType
<pointshape></pointshape>
())

            {

                gcanvas.DrawWorldImageWithoutScaling(_plannedReceiver, pointShape.X, pointShape.Y, DrawingLevel.LevelOne);

            }

        }


 


//Performance2


   protected override void DrawCore(IEnumerable<feature></feature> features, GeoCanvas canvas, Collection<simplecandidate></simplecandidate> labelsInThisLayer,

                                         Collection<simplecandidate></simplecandidate> labelsInAllLayers)

        {



            base.DrawCore(features, canvas, labelsInThisLayer, labelsInAllLayers);



            var gcanvas = canvas;



            if (gcanvas == null) return;



            foreach (var pointShape in features.Select(feature => feature.Tag).OfType
<pointshape></pointshape>
())

            {

               gcanvas.DrawWorldImageWithoutScaling(_plannedReceiver, pointShape.X, pointShape.Y, DrawingLevel.LevelOne);

            }

        }


 


 



 Marat,


 
Thanks for your information. I checked your code and found something we can improve in your code. Please check the following suggestions and also the comments in the attached sample.


        
  1. The LayerOverlay are rendered in single tile mode, which means it doesn’t take any advantage of multithreading. It only renders in single thread by one point after another.

         

  2.     
  3. After the features are added into an InMemoryFeatureLayer, the spatial index is not built, so it won’t use spatial index while querying the features. So I added code to build indices like the following code.

        _featureLayer.BuildIndex();
         

  4.     
  5. I saw the you called map.CenterAt() method and then called Refresh() method right after it. This one will refresh the map twice. We can remove one of them.

         

  6.     
  7. In the CustomStyle class, you create a bitmap as a symbol and rendered these in the draw core method. This is the main reason what affects the performance. In WIC (windows imaging component), to draw a bitmap on the screen, we need convert it to  D2DBitmap, while this conversion will be slower. When you draw lots of bitmap on the screen, this conversion will be executed once and once again so that the performance will be slow. I recommend to render the vector directly and you will get best performance in your demo.

         

  8.     
  9. The last thing is the cache. If a layer’s style and features are very stabled, we can turn on the cache and the vertices won’t be rendered repeatedly.


Please try my attached sample and feel free to let us know if you have more questions.
 
Thanks,
Howard

 



001_Performance1.zip (11.4 KB)

Howard,


This is great! Thank you.  I have couple of questions though. What is the best way in terms of performance to properly use D2DBitmap in the given sample app? Many of the features we render are more complex then just simple shapes... we have a graphic artist who created bitmaps for various pieces of equipment that are deployed in the field, and we'd like to keep using those.  It doesn't look like you have an API call that takes a D2DBitmap.  We use a lot of custom styles so we can call the DrawWorldImageWithoutScaling method.


Could you please provide usage pattern of D2DBitmap?


Thank you,


Marat



We are very pleased with the progress we've made thus far on this. 



Per Marat's suggesting of us using an API call to support D2DBitmaps.... if this in itself is not possible, I have another idea. 



Many of our bitmaps are common for a particular feature type, however, sometimes we slightly alter the bitmap to represent a different state / status of the feature.  In our custom styles, we cache and reuse these bitmaps. 



Perhaps there would be a way for us to register bitmaps with ThinkGeo so you don't have to constantly have to be converting to D2DBitmaps... they could be pre-converted and cached on your end. 



Thanks, 

Greg



 Hi Marat, Greg,


 
Thanks for you advice and we have enhanced the speed with drawing bitmap like your attached sample. Please get the latest version 6.0.26.0. In this version, we added our WicBitmap Extension in our daily build. For now, the extension is only embedded in the WPFDesktopEdition, we will keep on moving forward to add it to the other products. When you get this daily build, please replace the WicBitmapExtension.dll with the one in the latest build. If you have any trouble on getting the latest version or running the sample, please let me know.
 
I tested the sample works pretty good, hope you enjoy it.
 
Thanks,
Howard

002_001_Performance1.zip (11.9 KB)

Howard, 
  
 I didn’t find your WicBitmap Extension in your daily build in both Daily Developement Builds and Daily Production Builds. I tried these two: 
 WpfDesktopEditionFull6.0.0.0DllPackage.zip and WpfDesktopEditionFull6.0.0.28DllPackage.zip.  Could you please clarify what you meant by daily build?  I am not sure what has changed in your API?  Is it possible to address my and Greg’s questions above? 
  
 Thank you, 
 Marat

Hello Marat, 
  
 Sorry for the inconvenience, you can find the newest WicExtension in WpfDesktopEditionFull6.0.0.0DllPackage\Spatial Extensions\WicBitmap Extension. 
  
 Let us know if you still meet problem after refer that. 
  
 Regards, 
  
 Gary