public void Enqueue(RegionPosition regionPos, MapRegionLayer region) { var entry = new TileScaleEntry(regionPos, region); foreach (var runner in _runners) { runner.Enqueue(entry); } }
public void Enqueue(TileScaleEntry entry) { lock (_queueSync) { if (_updates.Contains(entry)) { return; } _updates.Enqueue(entry); } }
private void ScaleRegion(TileScaleEntry entry) { var sw = Stopwatch.StartNew(); var regionPos = entry.Position; if (!entry.IsRegionDirty(regionPos.GetBlockBounds())) { return; } using (var baseImg = entry.GetBitmap()) { var format = baseImg.PixelFormat; var sync = new object(); //Parallel.For(0, Scale, tX => for (int tX = 0; tX < Scale; tX++) { //Parallel.For(0, Scale, tZ => for (int tZ = 0; tZ < Scale; tZ++) { // Check if update is actually required. var tilePos = new TilePosition((regionPos.X << Zoom) + tX, (regionPos.Z << Zoom) + tZ, Zoom); if (!entry.IsRegionDirty(tilePos.GetBlockBounds())) { continue; } Bitmap img; lock (sync) { img = baseImg.Clone( new Rectangle(tX * RegionTileSize.Width, tZ * RegionTileSize.Height, RegionTileSize.Width, RegionTileSize.Height), format); } DrawTile(img, tilePos); Scaler.OnTileUpdated?.Invoke(this, new TileUpdateEventArgs(Scaler.LevelId, Scaler.LayerId, tilePos)); } //); } //); } //Log.InfoFormat("Scaled Region {0} to Zoom Level {1} in {2}ms", regionPos, Zoom, sw.ElapsedMilliseconds); }