ThinkGeo.com    |     Documentation    |     Premium Support

Hybrid TileCache

    Hi,



 I was planning to mix up InMemoryBitmapTileCache and FileBitmapTileCache into a subclass of the former so tiles are first looked up in memory and then in file and rendered if not found in either caches, being stored in both memory and disk after rendering, maybe even queuing the file write operations to be done in a low priority background thread.



 I guess the only methods I should override are DeleteTile, GetTile and SaveTile, as I expect DeleteTiles, GetTiles and SaveTiles calls the previous methods internally, right?



 Is there any thing else I should consider?



 As a related question, for SingleTileMode you recommended me to set:

bitmapTileCache.TileMatrix.BoundingBox = New RectangleShape(-100000000, 100000000, 100000000, -100000000)


 When the TileMatrix.BoundingBox for a MultiTile overlay is RectangleShape(-180, 90, 180, -90). Won’t it be any issue when mixing different kind of overlays ones with one tile matrix bounding box and other with other?

By the way, is InMemoryBitmapTileCache working? I doesn’t seem to be working (dll 6.0.360.0) 


Hi Carlos, 
  
 InMemoryBitmapTileCache should works because we haven’t modified it from 6.0. If you met problem when use InMemoryBitmapTileCache please let me know that. 
  
 Override DeleteTileCore, GetTileCore and SaveTileCore is enough for basic functions. And if you want you can also override ClearCacheCore for clear cache and GetHigherScaleTileCore for preview effects when Zoom. 
  
 Regards, 
  
 Don

Hi Don, 



Please find attached the test results after moving the map 100 times (ZoomTo - point shape), as you can see the results are better without InMemoryBitmapTileCache than with it. In addition I see the Overlay Drawn is fired 200 times more after the test have finished. Why? 



Regards, 



Carlos

130709_InMemoryBitmapTileCache_TestResults.zip (39.5 KB)

Ok, I see the Overlay Drawn is fired tree times because of BackgroundOverlay and ExtentInteractiveOverlays. Anyway, the times continues to be higher with InMemoryBitmapTileCache.  
  
  By the way I forgot to mention that the Tiles are indeed present in the TileCache after the test.

Hi Carlos, 
  
 Thanks for your code and test result, that’s really helpful. 
  
 After research I found we have an exception in GetTileCore function of InMemoryBitmapTileCache class, it takes more time and make we cannot get tile succeed.  
  
 I have listed it as a bug to our developer, if they solve it I will update the status here, would you please wait for a while before it is sorted out. 
  
 Regards, 
  
 Don 


Hi Carlos,  



We have fixed this, but maybe my machine not pretty well, the InMemoryBitmapTileCache looks don’t very fast than only use FileBitmapTileCache. 



The fix could be found in 7.0.39.0(0.39), if you get it, you can have a quickly test with your original sample. 



Any question please let me know.



Regards, 



Don

Hi Don, 
  
  I tested it, but I don’t see any performance advantage over simple FileBitmapTileCache. 
  
  Regards, 
  
 Carlos

Hi Carlos,



Actually, in test sample, the time spending on drawing overlay is a lot more than the time spent on get tile cache. If just call BitmapTileCache.GetTile() you could see the read speed from InMemoryBitmapTileCache is faster than FileBitmapTileCache. Following is the test result for these two TileCache, it records the time spent from calling GetTile.




Thanks,



Summer