diff --git a/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs b/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs
index c4ce7d299..7a3adfb53 100644
--- a/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs
+++ b/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs
@@ -1,4 +1,5 @@
using System.Buffers;
+using System.Runtime.InteropServices;
namespace SixLabors.ImageSharp.Memory
{
@@ -7,9 +8,30 @@ namespace SixLabors.ImageSharp.Memory
///
public class ArrayPoolMemoryManager : MemoryManager
{
+ private readonly int minSizeBytes;
+
+ ///
+ /// Initializes a new instance of the class.
+ /// By passing an integer greater than 0 as , a
+ /// minimum threshold for pooled allocations is set. Any allocation requests that
+ /// would require less size than the threshold will not be managed within the array pool.
+ ///
+ ///
+ /// Minimum size, in bytes, before an array pool is used to satisfy the request.
+ ///
+ public ArrayPoolMemoryManager(int minSizeBytes = 0)
+ {
+ this.minSizeBytes = minSizeBytes;
+ }
+
///
internal override Buffer Allocate(int size, bool clear = false)
{
+ if (this.minSizeBytes > 0 && size < this.minSizeBytes * SizeHelper.Size)
+ {
+ return new Buffer(new T[size], size);
+ }
+
var buffer = new Buffer(PixelDataPool.Rent(size), size, this);
if (clear)
{
@@ -24,5 +46,19 @@ namespace SixLabors.ImageSharp.Memory
{
PixelDataPool.Return(buffer.Array);
}
+
+ internal static class SizeHelper
+ {
+ static SizeHelper()
+ {
+ #if NETSTANDARD1_1
+ Size = Marshal.SizeOf(typeof(T));
+ #else
+ Size = Marshal.SizeOf();
+ #endif
+ }
+
+ public static int Size { get; }
+ }
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Memory/MemoryManager.cs b/src/ImageSharp/Memory/MemoryManager.cs
index 38e68e22c..b68a01feb 100644
--- a/src/ImageSharp/Memory/MemoryManager.cs
+++ b/src/ImageSharp/Memory/MemoryManager.cs
@@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.Memory
///
/// Gets or sets the that is currently in use.
///
- public static MemoryManager Current { get; set; } = new ArrayPoolMemoryManager();
+ public static MemoryManager Current { get; set; } = new ArrayPoolMemoryManager(1024 * 80);
///
/// Allocates a of size , optionally
diff --git a/src/ImageSharp/Memory/NullMemoryManager.cs b/src/ImageSharp/Memory/NullMemoryManager.cs
new file mode 100644
index 000000000..32642dae4
--- /dev/null
+++ b/src/ImageSharp/Memory/NullMemoryManager.cs
@@ -0,0 +1,19 @@
+namespace SixLabors.ImageSharp.Memory
+{
+ ///
+ /// Implements by allocating new buffers on every call.
+ ///
+ public class NullMemoryManager : MemoryManager
+ {
+ ///
+ internal override Buffer Allocate(int size, bool clear = false)
+ {
+ return new Buffer(new T[size], size);
+ }
+
+ ///
+ internal override void Release(Buffer buffer)
+ {
+ }
+ }
+}