Do not keep map pakages loaded on Game start to reduce memory impact
This commit is contained in:
@@ -985,7 +985,7 @@ namespace OpenRA
|
|||||||
Order.Command($"state {Session.ClientState.Ready}")
|
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)
|
if (map == null)
|
||||||
throw new ArgumentException($"Could not find map '{launchMap}'.");
|
throw new ArgumentException($"Could not find map '{launchMap}'.");
|
||||||
|
|
||||||
|
|||||||
@@ -153,6 +153,9 @@ namespace OpenRA
|
|||||||
var uid = Map.ComputeUID(mapPackage);
|
var uid = Map.ComputeUID(mapPackage);
|
||||||
previews[uid].UpdateFromMap(mapPackage, package, classification, modData.Manifest.MapCompatibility, mapGrid.Type, modDataRules);
|
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)
|
if (oldMap != uid)
|
||||||
{
|
{
|
||||||
LastModifiedMap = uid;
|
LastModifiedMap = uid;
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ namespace OpenRA
|
|||||||
dirty = false;
|
dirty = false;
|
||||||
foreach (var mapAction in mapActionQueue)
|
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 (map != null)
|
||||||
{
|
{
|
||||||
if (mapAction.Value == MapAction.Delete)
|
if (mapAction.Value == MapAction.Delete)
|
||||||
|
|||||||
@@ -174,7 +174,19 @@ namespace OpenRA
|
|||||||
readonly ModData modData;
|
readonly ModData modData;
|
||||||
|
|
||||||
public readonly string Uid;
|
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;
|
IReadOnlyPackage parentPackage;
|
||||||
|
|
||||||
volatile InnerData innerData;
|
volatile InnerData innerData;
|
||||||
@@ -286,7 +298,7 @@ namespace OpenRA
|
|||||||
cache = modData.MapCache;
|
cache = modData.MapCache;
|
||||||
|
|
||||||
Uid = map.Uid;
|
Uid = map.Uid;
|
||||||
Package = map.Package;
|
PackageName = map.Package.Name;
|
||||||
|
|
||||||
var mapPlayers = new MapPlayers(map.PlayerDefinitions);
|
var mapPlayers = new MapPlayers(map.PlayerDefinitions);
|
||||||
var spawns = new List<CPos>();
|
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();
|
yaml = new MiniYaml(null, MiniYaml.FromStream(yamlStream, $"{p.Name}:map.yaml", stringPool: cache.StringPool)).ToDictionary();
|
||||||
}
|
}
|
||||||
|
|
||||||
Package = p;
|
PackageName = p.Name;
|
||||||
parentPackage = parent;
|
parentPackage = parent;
|
||||||
|
|
||||||
var newData = innerData.Clone();
|
var newData = innerData.Clone();
|
||||||
@@ -587,10 +599,15 @@ namespace OpenRA
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
if (Package != null)
|
DisposePackage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisposePackage()
|
||||||
|
{
|
||||||
|
if (package != null)
|
||||||
{
|
{
|
||||||
Package.Dispose();
|
package.Dispose();
|
||||||
Package = null;
|
package = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -247,7 +247,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
if (map.Package?.Name != combinedPath)
|
if (map.Package?.Name != combinedPath)
|
||||||
{
|
{
|
||||||
// When creating a new map or when file paths don't match
|
// 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,
|
ConfirmationDialogs.ButtonPrompt(modData,
|
||||||
title: OverwriteMapFailedTitle,
|
title: OverwriteMapFailedTitle,
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
.Select(p => new
|
.Select(p => new
|
||||||
{
|
{
|
||||||
Preview = p,
|
Preview = p,
|
||||||
Index = missionMapPaths.IndexOf(Path.GetFileName(p.Package.Name))
|
Index = missionMapPaths.IndexOf(Path.GetFileName(p.PackageName))
|
||||||
})
|
})
|
||||||
.Where(x => x.Index != -1)
|
.Where(x => x.Index != -1)
|
||||||
.OrderBy(x => x.Index)
|
.OrderBy(x => x.Index)
|
||||||
|
|||||||
Reference in New Issue
Block a user