Show More
Commit Description:
Optimize PreserveCounts and only recalculate when needed....
Commit Description:
Optimize PreserveCounts and only recalculate when needed.
Previously would recalculate preservecounts every Update call (~1 per frame), which isn't necessary
when there's no tick. Might be some room to tweak, like doing these updates only when preserves change.
Some measurements: This takes about 30ms versus the .25 ms with no preserve (then like .0002ms).
When the map is filled up with preserve, about 35ms and 9ms. With a handful of
cells, it's more like 0.8ms (before JIT optimizes most of it away).
References:
File last commit:
Show/Diff file:
Action:
FNA/src/GameServiceContainer.cs
88 lines | 1.6 KiB | text/x-csharp | CSharpLexer
88 lines | 1.6 KiB | text/x-csharp | CSharpLexer
r0 | #region License | |||
/* FNA - XNA4 Reimplementation for Desktop Platforms | ||||
* Copyright 2009-2020 Ethan Lee and the MonoGame Team | ||||
* | ||||
* Released under the Microsoft Public License. | ||||
* See LICENSE for details. | ||||
*/ | ||||
/* Derived from code by the Mono.Xna Team (Copyright 2006). | ||||
* Released under the MIT License. See monoxna.LICENSE for details. | ||||
*/ | ||||
#endregion | ||||
#region Using Statements | ||||
using System; | ||||
using System.Collections.Generic; | ||||
#endregion | ||||
namespace Microsoft.Xna.Framework | ||||
{ | ||||
public class GameServiceContainer : IServiceProvider | ||||
{ | ||||
#region Private Fields | ||||
Dictionary<Type, object> services; | ||||
#endregion | ||||
#region Public Constructors | ||||
public GameServiceContainer() | ||||
{ | ||||
services = new Dictionary<Type, object>(); | ||||
} | ||||
#endregion | ||||
#region Public Methods | ||||
public void AddService(Type type, object provider) | ||||
{ | ||||
if (type == null) | ||||
{ | ||||
throw new ArgumentNullException("type"); | ||||
} | ||||
if (provider == null) | ||||
{ | ||||
throw new ArgumentNullException("provider"); | ||||
} | ||||
if (!type.IsAssignableFrom(provider.GetType())) | ||||
{ | ||||
throw new ArgumentException( | ||||
"The provider does not match the specified service type!" | ||||
); | ||||
} | ||||
services.Add(type, provider); | ||||
} | ||||
public object GetService(Type type) | ||||
{ | ||||
if (type == null) | ||||
{ | ||||
throw new ArgumentNullException("type"); | ||||
} | ||||
object service; | ||||
if (services.TryGetValue(type, out service)) | ||||
{ | ||||
return service; | ||||
} | ||||
return null; | ||||
} | ||||
public void RemoveService(Type type) | ||||
{ | ||||
if (type == null) | ||||
{ | ||||
throw new ArgumentNullException("type"); | ||||
} | ||||
services.Remove(type); | ||||
} | ||||
#endregion | ||||
} | ||||
} | ||||