In ThinkGeo.Core 15.0.0-beta154, Layer.DrawWithColorTransformation (used for every layer with Opacity < 1 ) renders the layer offscreen, applies the opacity into a new bitmap, and then calls GetImageBytes() followed by new GeoImage(bytes) . That is a full PNG encode and decode for every tile of every see-through layer, only to get a new image object.
Skia can draw the offscreen bitmap onto the tile with an alpha in one call ( SKPaint with an alpha colour), with no copy at all. Please replace the round trip with that.
Related: GeoImage.Opacity copies all pixels to managed memory and back. An opacity parameter on GeoCanvas.DrawWorldImageWithoutScaling / DrawScreenImageWithoutScaling would avoid that too.
Versions: ThinkGeo.Core / ThinkGeo.UI.Wpf 15.0.0-beta154, .NET 10, WPF.