diff --git a/OpenRA.Game/Graphics/CursorManager.cs b/OpenRA.Game/Graphics/CursorManager.cs index 1837c1a048..253416db99 100644 --- a/OpenRA.Game/Graphics/CursorManager.cs +++ b/OpenRA.Game/Graphics/CursorManager.cs @@ -128,7 +128,7 @@ namespace OpenRA.Graphics } } - sheetBuilder.Current.ReleaseBuffer(); + sheetBuilder.Current?.ReleaseBuffer(); hardwareCursorsDoubled = graphicSettings.CursorDouble; } diff --git a/OpenRA.Game/Graphics/SheetBuilder.cs b/OpenRA.Game/Graphics/SheetBuilder.cs index 27721c91c0..a420f85859 100644 --- a/OpenRA.Game/Graphics/SheetBuilder.cs +++ b/OpenRA.Game/Graphics/SheetBuilder.cs @@ -75,8 +75,6 @@ namespace OpenRA.Graphics { CurrentChannel = t == SheetType.Indexed ? TextureChannel.Red : TextureChannel.RGBA; Type = t; - Current = allocateSheet(); - sheets.Add(Current); this.allocateSheet = allocateSheet; this.margin = margin; } @@ -85,6 +83,12 @@ namespace OpenRA.Graphics public Sprite Add(byte[] src, SpriteFrameType type, Size size, bool premultiplied = false) { return Add(src, type, size, 0, float3.Zero, premultiplied); } public Sprite Add(byte[] src, SpriteFrameType type, Size size, float zRamp, in float3 spriteOffset, bool premultiplied = false) { + if (Current == null) + { + Current = allocateSheet(); + sheets.Add(Current); + } + // Don't bother allocating empty sprites if (size.Width == 0 || size.Height == 0) return new Sprite(Current, Rectangle.Empty, 0, spriteOffset, CurrentChannel, BlendMode.Alpha); @@ -115,6 +119,12 @@ namespace OpenRA.Graphics public Sprite Allocate(Size imageSize, float scale = 1f) { return Allocate(imageSize, 0, float3.Zero, scale); } public Sprite Allocate(Size imageSize, float zRamp, in float3 spriteOffset, float scale = 1f) { + if (Current == null) + { + Current = allocateSheet(); + sheets.Add(Current); + } + if (imageSize.Width + p.X + margin > Current.Size.Width) { p = new int2(0, p.Y + rowHeight + margin); diff --git a/OpenRA.Game/Graphics/SpriteCache.cs b/OpenRA.Game/Graphics/SpriteCache.cs index e75aa844ab..afa82f47b8 100644 --- a/OpenRA.Game/Graphics/SpriteCache.cs +++ b/OpenRA.Game/Graphics/SpriteCache.cs @@ -155,7 +155,7 @@ namespace OpenRA.Graphics } foreach (var sb in SheetBuilders.Values) - sb.Current.ReleaseBuffer(); + sb.Current?.ReleaseBuffer(); } public Sprite[] ResolveSprites(int token) diff --git a/OpenRA.Game/Map/MapCache.cs b/OpenRA.Game/Map/MapCache.cs index 827226959d..3bc61428af 100644 --- a/OpenRA.Game/Map/MapCache.cs +++ b/OpenRA.Game/Map/MapCache.cs @@ -340,7 +340,9 @@ namespace OpenRA } // Release the buffer by forcing changes to be written out to the texture, allowing the buffer to be reclaimed by GC. - Game.RunAfterTick(sheetBuilder.Current.ReleaseBuffer); + if (sheetBuilder.Current != null) + Game.RunAfterTick(sheetBuilder.Current.ReleaseBuffer); + Log.Write("debug", "MapCache.LoadAsyncInternal ended"); } diff --git a/OpenRA.Mods.Cnc/Graphics/VoxelLoader.cs b/OpenRA.Mods.Cnc/Graphics/VoxelLoader.cs index 5e7738e7c1..7626d6a1ac 100644 --- a/OpenRA.Mods.Cnc/Graphics/VoxelLoader.cs +++ b/OpenRA.Mods.Cnc/Graphics/VoxelLoader.cs @@ -228,7 +228,7 @@ namespace OpenRA.Mods.Cnc.Graphics public void Finish() { - sheetBuilder.Current.ReleaseBuffer(); + sheetBuilder.Current?.ReleaseBuffer(); } public void Dispose() diff --git a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs index 6674f0ebba..3c1baba3ae 100644 --- a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs +++ b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs @@ -145,7 +145,7 @@ namespace OpenRA.Mods.Common.Terrain MissingTile = sheetBuilders[missingSheetType].Add(new byte[missingDataLength], missingFrameType, new Size(1, 1)); foreach (var sb in sheetBuilders.Values) - sb.Current.ReleaseBuffer(); + sb.Current?.ReleaseBuffer(); } public bool HasTileSprite(TerrainTile r, int? variant = null)