Example #1
0
        public static void PurgeLRU()
        {
            if (tiles.Count < maxReadyToRenderSize)
            {
                return;
            }

            List <Tile> notReadyCullList = new List <Tile>();
            List <Tile> readyCullList    = new List <Tile>();

            try
            {
                try
                {
                    foreach (string key in tiles.Keys)
                    {
                        Tile tile = tiles[key];

                        if (tile.RenderedGeneration < (Tile.CurrentRenderGeneration - 10) && !(tile.RequestPending || tile.Downloading))
                        {
                            if (tile.ReadyToRender)
                            {
                                readyCullList.Add(tile);
                            }
                            else
                            {
                                notReadyCullList.Add(tile);
                            }
                        }
                    }
                }
                catch
                {
                }
                readyToRenderCount = readyCullList.Count;

                if (readyCullList.Count > maxReadyToRenderSize)
                {
                    readyCullList.Sort(delegate(Tile t1, Tile t2)
                    {
                        return(t2.AccessCount < t1.AccessCount ? 1 : (t2.AccessCount == t1.AccessCount ? 0 : -1));
                    }
                                       );
                    int totalToPurge = readyCullList.Count - maxReadyToRenderSize;

                    foreach (Tile tile in readyCullList)
                    {
                        if (totalToPurge < 1)
                        {
                            break;
                        }
                        tile.CleanUp(false);

                        //tile.CleanUp(true);
                        //tiles.Remove(tile.Key);
                        totalToPurge--;
                    }
                }

                if (tiles.Count < maxTileCacheSize)
                {
                    return;
                }

                if (notReadyCullList.Count > maxTileCacheSize)
                {
                    notReadyCullList.Sort(delegate(Tile t1, Tile t2)
                    {
                        return(t2.AccessCount < t1.AccessCount ? 1 : (t2.AccessCount == t1.AccessCount ? 0 : -1));
                    }
                                          );

                    int totalToPurge = notReadyCullList.Count - maxTileCacheSize;
                    if (totalToPurge > 20)
                    {
                        totalToPurge = 20;
                    }
                    foreach (Tile tile in notReadyCullList)
                    {
                        if (totalToPurge < 1)
                        {
                            break;
                        }
                        tile.CleanUp(true);
                        tiles.Remove(tile.Key);

                        totalToPurge--;
                    }
                }
            }
            catch
            {
            }
            finally
            {
            }

            return;
        }