Do not keep map pakages loaded on Game start to reduce memory impact

This commit is contained in:
chacha
2024-04-24 13:27:20 +02:00
committed by Gustas
parent affc98851c
commit e5a7b6e795
6 changed files with 30 additions and 10 deletions

View File

@@ -985,7 +985,7 @@ namespace OpenRA
Order.Command($"state {Session.ClientState.Ready}")
};
var map = ModData.MapCache.SingleOrDefault(m => m.Uid == launchMap || Path.GetFileName(m.Package.Name) == launchMap);
var map = ModData.MapCache.SingleOrDefault(m => m.Uid == launchMap || Path.GetFileName(m.PackageName) == launchMap);
if (map == null)
throw new ArgumentException($"Could not find map '{launchMap}'.");

View File

@@ -153,6 +153,9 @@ namespace OpenRA
var uid = Map.ComputeUID(mapPackage);
previews[uid].UpdateFromMap(mapPackage, package, classification, modData.Manifest.MapCompatibility, mapGrid.Type, modDataRules);
// Freeing the package to save memory if there is a lot of Maps
previews[uid].DisposePackage();
if (oldMap != uid)
{
LastModifiedMap = uid;

View File

@@ -86,7 +86,7 @@ namespace OpenRA
dirty = false;
foreach (var mapAction in mapActionQueue)
{
var map = mapcache.FirstOrDefault(x => x.Package?.Name == mapAction.Key && x.Status == MapStatus.Available);
var map = mapcache.FirstOrDefault(x => x.PackageName == mapAction.Key && x.Status == MapStatus.Available);
if (map != null)
{
if (mapAction.Value == MapAction.Delete)

View File

@@ -174,7 +174,19 @@ namespace OpenRA
readonly ModData modData;
public readonly string Uid;
public IReadOnlyPackage Package { get; private set; }
public string PackageName { get; private set; }
IReadOnlyPackage package;
public IReadOnlyPackage Package
{
get
{
package ??= parentPackage.OpenPackage(PackageName, modData.ModFiles);
return package;
}
private set => package = value;
}
IReadOnlyPackage parentPackage;
volatile InnerData innerData;
@@ -286,7 +298,7 @@ namespace OpenRA
cache = modData.MapCache;
Uid = map.Uid;
Package = map.Package;
PackageName = map.Package.Name;
var mapPlayers = new MapPlayers(map.PlayerDefinitions);
var spawns = new List<CPos>();
@@ -338,7 +350,7 @@ namespace OpenRA
yaml = new MiniYaml(null, MiniYaml.FromStream(yamlStream, $"{p.Name}:map.yaml", stringPool: cache.StringPool)).ToDictionary();
}
Package = p;
PackageName = p.Name;
parentPackage = parent;
var newData = innerData.Clone();
@@ -587,10 +599,15 @@ namespace OpenRA
public void Dispose()
{
if (Package != null)
DisposePackage();
}
public void DisposePackage()
{
if (package != null)
{
Package.Dispose();
Package = null;
package.Dispose();
package = null;
}
}

View File

@@ -247,7 +247,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (map.Package?.Name != combinedPath)
{
// When creating a new map or when file paths don't match
if (modData.MapCache.Any(m => m.Status == MapStatus.Available && m.Package?.Name == combinedPath))
if (modData.MapCache.Any(m => m.Status == MapStatus.Available && m.PackageName == combinedPath))
{
ConfirmationDialogs.ButtonPrompt(modData,
title: OverwriteMapFailedTitle,

View File

@@ -141,7 +141,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
.Select(p => new
{
Preview = p,
Index = missionMapPaths.IndexOf(Path.GetFileName(p.Package.Name))
Index = missionMapPaths.IndexOf(Path.GetFileName(p.PackageName))
})
.Where(x => x.Index != -1)
.OrderBy(x => x.Index)