예제 #1
0
        CustomWWW getCachedWWW(string url, TileInfo ti)
        {
            string    filePath = GetLocalFilePathForURL(url, ti);
            CustomWWW www;
            bool      useCached = false;

            useCached = _tileEnableLocalCache && System.IO.File.Exists(filePath);
            if (useCached)
            {
                if (!_tilePreloadTiles || !filePath.Contains(PREFIX_MIN_ZOOM_LEVEL))
                {
                    //check how old
                    System.DateTime written    = File.GetLastWriteTimeUtc(filePath);
                    System.DateTime now        = System.DateTime.UtcNow;
                    double          totalHours = now.Subtract(written).TotalHours;
                    if (totalHours > 300)
                    {
                        File.Delete(filePath);
                        useCached = false;
                    }
                }
            }
            ti.source = useCached ? TILE_SOURCE.Cache : TILE_SOURCE.Online;
            if (useCached)
            {
#if UNITY_STANDALONE_WIN || UNITY_WSA
                string pathforwww = "file:///" + filePath;
#else
                string pathforwww = "file://" + filePath;
#endif
                www = new CustomWWW(pathforwww);
            }
            else
            {
                www = new CustomWWW(url);
            }
            return(www);
        }
예제 #2
0
        internal IEnumerator LoadTileContentBackground(TileInfo ti)
        {
            yield return(new WaitForEndOfFrame());

            string url = GetTileURL(_tileServer, ti);

            if (string.IsNullOrEmpty(url))
            {
                Debug.LogError("Tile server url not set. Aborting");
                yield break;
            }

            long   downloadedBytes = 0;
            string error           = null;
            string filePath        = "";

            byte[] textureBytes = null;
            ti.source = TILE_SOURCE.Unknown;

            // Check if tile is given by external event
            if (OnTileRequest != null)
            {
                if (OnTileRequest(ti.zoomLevel, ti.x, ti.y, out ti.texture, out error) && ti.texture != null)
                {
                    ti.source = TILE_SOURCE.Resources;
                }
            }

            // Check if tile is in Resources
            if (ti.source == TILE_SOURCE.Unknown && _tileEnableOfflineTiles)
            {
                string          path    = GetTileResourcePath(ti.x, ti.y, ti.zoomLevel, false);
                ResourceRequest request = Resources.LoadAsync <Texture2D> (path);
                yield return(request);

                if (request.asset != null)
                {
                    ti.texture = (Texture2D)request.asset;
                    ti.source  = TILE_SOURCE.Resources;
                }
                else if (tileOfflineTilesOnly)
                {
                    ti.texture = tileResourceFallbackTexture;
                    ti.source  = TILE_SOURCE.Resources;
                }
            }

            CustomWWW www = null;

            if (ti.source == TILE_SOURCE.Unknown)
            {
                www = getCachedWWW(url, ti);
                yield return(www);

                error = www.error;
            }

            for (int tries = 0; tries < 100; tries++)
            {
                if (spreadLoadAmongFrames > 0)
                {
                    break;
                }
                yield return(new WaitForEndOfFrame());
            }
            spreadLoadAmongFrames--;
            _concurrentLoads--;

            if (!ti.visible)                    // non visible textures are ignored
            {
                ti.loadStatus = TILE_LOAD_STATUS.InQueue;
                yield break;
            }

            if (!string.IsNullOrEmpty(error))
            {
                _tileLastError     = "Error getting tile: " + error + " url=" + url;
                _tileLastErrorDate = DateTime.Now;
                if (_tileDebugErrors)
                {
                    Debug.Log(_tileLastErrorDate + " " + _tileLastError);
                }
                ti.loadStatus = TILE_LOAD_STATUS.InQueue;
                yield break;
            }

            // Load texture
            if (ti.source != TILE_SOURCE.Resources)
            {
                downloadedBytes = www.bytesDownloaded;
                textureBytes    = www.bytes;
                ti.texture      = www.textureNonReadable;
                www.Dispose();
                www = null;

                // Check texture consistency
                if (ti.loadedFromCache || _tileEnableLocalCache)
                {
                    filePath = GetLocalFilePathForURL(url, ti);
                }

                if (ti.loadedFromCache && ti.texture.width <= 16)                   // Invalid texture in local cache, retry
                {
                    if (File.Exists(filePath))
                    {
                        File.Delete(filePath);
                    }
                    ti.loadStatus = TILE_LOAD_STATUS.Inactive;
                    ti.queueTime  = Time.time;
                    yield break;
                }
            }

            ti.texture.wrapMode = TextureWrapMode.Clamp;
            _tileSize           = ti.texture.width;

            // Save texture
            if (_tileEnableLocalCache && ti.source != TILE_SOURCE.Resources && !File.Exists(filePath))
            {
                _tileCurrentCacheUsage += textureBytes.Length;
                BackgroundSaver saver = new BackgroundSaver(textureBytes, filePath);
                saver.Start();
            }

            // Update stats
            switch (ti.source)
            {
            case TILE_SOURCE.Cache:
                _cacheLoads++;
                _cacheLoadTotalSize += downloadedBytes;
                break;

            case TILE_SOURCE.Resources:
                _resourceLoads++;
                break;

            default:
                _webDownloads++;
                _webDownloadTotalSize += downloadedBytes;
                break;
            }

            if (loadQueue.Contains(ti))
            {
                loadQueue.Remove(ti);
            }

            FinishLoadingTile(ti);
        }
        void Estimate()
        {
            // Manage downloads
            int activeDownloads = 0;

            for (int k = 0; k < concurrentDownloads; k++)
            {
                if (downloads [k].busy)
                {
                    CustomWWW www = downloads [k].www;
                    if (www.isDone)
                    {
                        bool good = string.IsNullOrEmpty(www.error);
                        // Check texture consistency
                        if (good)
                        {
                            Texture2D tex = www.textureNonReadable;
                            if (tex == null)
                            {
                                good = false;
                            }
                            else if (tex.width < 16)
                            {
                                good = false;
                                DestroyImmediate(tex);
                            }
                        }
                        if (good)
                        {
                            // save to resources
                            estimationTotalSize += www.bytesDownloaded * www.bytesDownloaded;
                            estimationDownloads++;
                            storageSize        = numTiles * Mathf.Sqrt(estimationTotalSize / estimationDownloads) / ONE_MEGABYTE;
                            downloads [k].busy = false;
                        }
                        else
                        {
                            if (downloads [k].retries < 3)
                            {
                                downloads [k].retries++;
                                Debug.LogError("Retrying " + downloads [k].retries + " times due error on tile XYZ = " + downloads [k].x + "/" + downloads [k].y + "/" + downloads [k].zoomLevel + " : " + www.error);
                                downloads [k].www = new CustomWWW(www.url);
                                activeDownloads++;
                            }
                            else
                            {
                                downloads [k].busy = false;
                            }
                        }
                        www.Dispose();
                    }
                    else
                    {
                        activeDownloads++;
                    }
                }
            }

            for (int k = 0; k < concurrentDownloads; k++)
            {
                if (!downloads [k].busy)
                {
                    if (activeDownloads >= concurrentDownloads)
                    {
                        return;
                    }

                    // Get next tile
                    bool remainingTiles = GetNextTileRandom();

                    // Have we finished?
                    if (!remainingTiles)
                    {
                        if (activeDownloads == 0)
                        {
                            StopOperation();
                        }
                        return;
                    }

                    ti.x         = x;
                    ti.y         = y;
                    ti.zoomLevel = zoomLevel;
                    string url = map.GetTileURL(map.tileServer, ti);
                    downloads [k].busy      = true;
                    downloads [k].retries   = 0;
                    downloads [k].x         = x;
                    downloads [k].y         = y;
                    downloads [k].zoomLevel = zoomLevel;
                    downloads [k].www       = new CustomWWW(url);
                    activeDownloads++;
                }
            }
        }
        void Download()
        {
            // Manage downloads
            int activeDownloads = 0;

            for (int k = 0; k < concurrentDownloads; k++)
            {
                if (downloads [k].busy)
                {
                    CustomWWW www = downloads [k].www;
                    if (www.isDone)
                    {
                        bool good = string.IsNullOrEmpty(www.error);
                        // Check texture consistency
                        if (good)
                        {
                            Texture2D tex = www.textureNonReadable;
                            if (tex == null)
                            {
                                good = false;
                            }
                            else if (tex.width < 16)
                            {
                                good = false;
                                DestroyImmediate(tex);
                            }
                        }
                        if (good)
                        {
                            // save to resources
                            bytesDownloaded += www.bytes.Length;
                            File.WriteAllBytes(downloads [k].path, www.bytes);
                            downloadedTilesCount++;
                            downloadedTilesSize += bytesDownloaded;
                            downloads [k].busy   = false;
                        }
                        else
                        {
                            if (downloads [k].retries < 3)
                            {
                                downloads [k].retries++;
                                Debug.LogError("Retrying " + downloads [k].retries + " times due error on tile XYZ = " + downloads [k].x + "/" + downloads [k].y + "/" + downloads [k].zoomLevel + " : " + www.error);
                                downloads [k].www = new CustomWWW(www.url);
                                activeDownloads++;
                            }
                            else
                            {
                                downloads [k].busy = false;
                            }
                        }
                        www.Dispose();
                    }
                    else
                    {
                        activeDownloads++;
                    }
                }
            }

            int iterations = 0;

            for (int k = 0; k < concurrentDownloads; k++)
            {
                if (!downloads [k].busy)
                {
                    if (activeDownloads >= concurrentDownloads)
                    {
                        return;
                    }

                    // Get next tile
                    bool remainingTiles = GetNextTile();

                    // Have we finished?
                    if (!remainingTiles)
                    {
                        if (activeDownloads == 0)
                        {
                            StopOperation();
                        }
                        return;
                    }

                    ti.x         = x;
                    ti.y         = y;
                    ti.zoomLevel = zoomLevel;
                    string url = map.GetTileURL(map.tileServer, ti);
                    // Is current tile already in Resources path?
                    string tilePath = map.GetTileResourcePath(x, y, zoomLevel);
                    if (File.Exists(tilePath))
                    {
                        if (++iterations < 128)
                        {
                            k--;
                        }
                    }
                    else
                    {
                        downloads [k].busy      = true;
                        downloads [k].retries   = 0;
                        downloads [k].x         = x;
                        downloads [k].y         = y;
                        downloads [k].zoomLevel = zoomLevel;
                        downloads [k].path      = tilePath;
                        downloads [k].www       = new CustomWWW(url);
                        activeDownloads++;
                    }
                }
            }
        }