Move try-catch during creation of sequences into the function rather than around the lazy initialization.

This fixes an issue with VS breaking on the exception because it thinks it will go unhandled, even though it will be handled.
This commit is contained in:
RoosterDragon
2014-06-23 22:03:45 +01:00
parent 04dbe9fc2a
commit 3c9f589b5e

View File

@@ -15,9 +15,12 @@ using System.Linq;
namespace OpenRA.Graphics namespace OpenRA.Graphics
{ {
using Sequences = IReadOnlyDictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>>;
using UnitSequences = Lazy<IReadOnlyDictionary<string, Sequence>>;
public class SequenceProvider public class SequenceProvider
{ {
readonly Lazy<IReadOnlyDictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>>> sequences; readonly Lazy<Sequences> sequences;
public readonly SpriteLoader SpriteLoader; public readonly SpriteLoader SpriteLoader;
public SequenceProvider(SequenceCache cache, Map map) public SequenceProvider(SequenceCache cache, Map map)
@@ -28,7 +31,7 @@ namespace OpenRA.Graphics
public Sequence GetSequence(string unitName, string sequenceName) public Sequence GetSequence(string unitName, string sequenceName)
{ {
Lazy<IReadOnlyDictionary<string, Sequence>> unitSeq; UnitSequences unitSeq;
if (!sequences.Value.TryGetValue(unitName, out unitSeq)) if (!sequences.Value.TryGetValue(unitName, out unitSeq))
throw new InvalidOperationException("Unit `{0}` does not have any sequences defined.".F(unitName)); throw new InvalidOperationException("Unit `{0}` does not have any sequences defined.".F(unitName));
@@ -41,7 +44,7 @@ namespace OpenRA.Graphics
public bool HasSequence(string unitName, string sequenceName) public bool HasSequence(string unitName, string sequenceName)
{ {
Lazy<IReadOnlyDictionary<string, Sequence>> unitSeq; UnitSequences unitSeq;
if (!sequences.Value.TryGetValue(unitName, out unitSeq)) if (!sequences.Value.TryGetValue(unitName, out unitSeq))
throw new InvalidOperationException("Unit `{0}` does not have any sequences defined.".F(unitName)); throw new InvalidOperationException("Unit `{0}` does not have any sequences defined.".F(unitName));
@@ -50,7 +53,7 @@ namespace OpenRA.Graphics
public IEnumerable<string> Sequences(string unitName) public IEnumerable<string> Sequences(string unitName)
{ {
Lazy<IReadOnlyDictionary<string, Sequence>> unitSeq; UnitSequences unitSeq;
if (!sequences.Value.TryGetValue(unitName, out unitSeq)) if (!sequences.Value.TryGetValue(unitName, out unitSeq))
throw new InvalidOperationException("Unit `{0}` does not have any sequences defined.".F(unitName)); throw new InvalidOperationException("Unit `{0}` does not have any sequences defined.".F(unitName));
@@ -60,16 +63,7 @@ namespace OpenRA.Graphics
public void Preload() public void Preload()
{ {
foreach (var unitSeq in sequences.Value.Values) foreach (var unitSeq in sequences.Value.Values)
{ foreach (var seq in unitSeq.Value.Values) { }
try
{
foreach (var seq in unitSeq.Value.Values);
}
catch (FileNotFoundException ex)
{
Log.Write("debug", ex.Message);
}
}
} }
} }
@@ -79,7 +73,7 @@ namespace OpenRA.Graphics
readonly Lazy<SpriteLoader> spriteLoader; readonly Lazy<SpriteLoader> spriteLoader;
public SpriteLoader SpriteLoader { get { return spriteLoader.Value; } } public SpriteLoader SpriteLoader { get { return spriteLoader.Value; } }
readonly Dictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>> sequenceCache = new Dictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>>(); readonly Dictionary<string, UnitSequences> sequenceCache = new Dictionary<string, UnitSequences>();
public SequenceCache(ModData modData, TileSet tileSet) public SequenceCache(ModData modData, TileSet tileSet)
{ {
@@ -88,13 +82,13 @@ namespace OpenRA.Graphics
spriteLoader = Exts.Lazy(() => new SpriteLoader(tileSet.Extensions, new SheetBuilder(SheetType.Indexed))); spriteLoader = Exts.Lazy(() => new SpriteLoader(tileSet.Extensions, new SheetBuilder(SheetType.Indexed)));
} }
public IReadOnlyDictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>> LoadSequences(Map map) public Sequences LoadSequences(Map map)
{ {
using (new Support.PerfTimer("LoadSequences")) using (new Support.PerfTimer("LoadSequences"))
return Load(map.SequenceDefinitions); return Load(map.SequenceDefinitions);
} }
IReadOnlyDictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>> Load(List<MiniYamlNode> sequenceNodes) Sequences Load(List<MiniYamlNode> sequenceNodes)
{ {
var sequenceFiles = modData.Manifest.Sequences; var sequenceFiles = modData.Manifest.Sequences;
@@ -102,7 +96,7 @@ namespace OpenRA.Graphics
.Select(s => MiniYaml.FromFile(s)) .Select(s => MiniYaml.FromFile(s))
.Aggregate(sequenceNodes, MiniYaml.MergeLiberal); .Aggregate(sequenceNodes, MiniYaml.MergeLiberal);
var items = new Dictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>>(); var items = new Dictionary<string, UnitSequences>();
foreach (var n in nodes) foreach (var n in nodes)
{ {
// Work around the loop closure issue in older versions of C# // Work around the loop closure issue in older versions of C#
@@ -110,23 +104,40 @@ namespace OpenRA.Graphics
var key = node.Value.ToLines(node.Key).JoinWith("|"); var key = node.Value.ToLines(node.Key).JoinWith("|");
Lazy<IReadOnlyDictionary<string, Sequence>> t; UnitSequences t;
if (sequenceCache.TryGetValue(key, out t)) if (sequenceCache.TryGetValue(key, out t))
items.Add(node.Key, t); items.Add(node.Key, t);
else else
{ {
t = Exts.Lazy(() => (IReadOnlyDictionary<string, Sequence>)new ReadOnlyDictionary<string, Sequence>( t = Exts.Lazy(() => CreateUnitSequences(node));
node.Value.ToDictionary().ToDictionary(x => x.Key, x =>
{
using (new Support.PerfTimer("new Sequence(\"{0}\")".F(node.Key), 20))
return new Sequence(spriteLoader.Value, node.Key, x.Key, x.Value);
})));
sequenceCache.Add(key, t); sequenceCache.Add(key, t);
items.Add(node.Key, t); items.Add(node.Key, t);
} }
} }
return new ReadOnlyDictionary<string, Lazy<IReadOnlyDictionary<string, Sequence>>>(items); return new ReadOnlyDictionary<string, UnitSequences>(items);
}
IReadOnlyDictionary<string, Sequence> CreateUnitSequences(MiniYamlNode node)
{
var unitSequences = new Dictionary<string, Sequence>();
foreach (var kvp in node.Value.ToDictionary())
{
using (new Support.PerfTimer("new Sequence(\"{0}\")".F(node.Key), 20))
{
try
{
unitSequences.Add(kvp.Key, new Sequence(spriteLoader.Value, node.Key, kvp.Key, kvp.Value));
}
catch (FileNotFoundException ex)
{
Log.Write("debug", ex.Message);
}
}
}
return new ReadOnlyDictionary<string, Sequence>(unitSequences);
} }
} }
} }