diff --git a/OpenRA.Game/FileSystem/ZipFile.cs b/OpenRA.Game/FileSystem/ZipFile.cs index e8ebf9ef0d..f1818aabff 100644 --- a/OpenRA.Game/FileSystem/ZipFile.cs +++ b/OpenRA.Game/FileSystem/ZipFile.cs @@ -44,7 +44,7 @@ namespace OpenRA.FileSystem using (var z = pkg.GetInputStream(entry)) { - var ms = new MemoryStream(); + var ms = new MemoryStream((int)entry.Size); z.CopyTo(ms); ms.Seek(0, SeekOrigin.Begin); return ms; @@ -104,7 +104,13 @@ namespace OpenRA.FileSystem // SharpZipLib breaks when asked to update archives loaded from outside streams or files // We can work around this by creating a clean in-memory-only file, cutting all outside references if (!create) - new MemoryStream(File.ReadAllBytes(filename)).CopyTo(pkgStream); + { + using (var copy = new MemoryStream(File.ReadAllBytes(filename))) + { + pkgStream.Capacity = (int)copy.Length; + copy.CopyTo(pkgStream); + } + } pkgStream.Position = 0; pkg = ZipFileHelper.Create(pkgStream); diff --git a/OpenRA.Game/Network/Connection.cs b/OpenRA.Game/Network/Connection.cs index 66d6c655d9..3db4471fca 100644 --- a/OpenRA.Game/Network/Connection.cs +++ b/OpenRA.Game/Network/Connection.cs @@ -77,10 +77,10 @@ namespace OpenRA.Network public virtual void SendSync(int frame, byte[] syncData) { - var ms = new MemoryStream(); + var ms = new MemoryStream(4 + syncData.Length); ms.Write(BitConverter.GetBytes(frame)); ms.Write(syncData); - Send(ms.ToArray()); + Send(ms.GetBuffer()); } protected virtual void Send(byte[] packet) @@ -197,10 +197,10 @@ namespace OpenRA.Network public override void SendSync(int frame, byte[] syncData) { - var ms = new MemoryStream(); + var ms = new MemoryStream(4 + syncData.Length); ms.Write(BitConverter.GetBytes(frame)); ms.Write(syncData); - queuedSyncPackets.Add(ms.ToArray()); + queuedSyncPackets.Add(ms.GetBuffer()); } protected override void Send(byte[] packet) diff --git a/OpenRA.Game/Network/Order.cs b/OpenRA.Game/Network/Order.cs index 2deb2bff76..68f4684678 100644 --- a/OpenRA.Game/Network/Order.cs +++ b/OpenRA.Game/Network/Order.cs @@ -240,7 +240,7 @@ namespace OpenRA { if (IsImmediate) { - var ret = new MemoryStream(); + var ret = new MemoryStream(1 + OrderString.Length + 1 + TargetString.Length + 1); var w = new BinaryWriter(ret); w.Write((byte)0xfe); w.Write(OrderString); diff --git a/OpenRA.Game/Network/OrderIO.cs b/OpenRA.Game/Network/OrderIO.cs index 750992a26d..26d0675784 100644 --- a/OpenRA.Game/Network/OrderIO.cs +++ b/OpenRA.Game/Network/OrderIO.cs @@ -38,14 +38,14 @@ namespace OpenRA.Network public static byte[] SerializeSync(int sync) { - var ms = new MemoryStream(); + var ms = new MemoryStream(1 + 4); using (var writer = new BinaryWriter(ms)) { writer.Write((byte)0x65); writer.Write(sync); } - return ms.ToArray(); + return ms.GetBuffer(); } public static int2 ReadInt2(this BinaryReader r) diff --git a/OpenRA.Game/Network/ReplayConnection.cs b/OpenRA.Game/Network/ReplayConnection.cs index 2cc2176e26..71dfcf5afd 100644 --- a/OpenRA.Game/Network/ReplayConnection.cs +++ b/OpenRA.Game/Network/ReplayConnection.cs @@ -127,10 +127,10 @@ namespace OpenRA.Network public void SendSync(int frame, byte[] syncData) { - var ms = new MemoryStream(); + var ms = new MemoryStream(4 + syncData.Length); ms.Write(BitConverter.GetBytes(frame)); ms.Write(syncData); - sync.Add(ms.ToArray()); + sync.Add(ms.GetBuffer()); // Store the current frame so Receive() can return the next chunk of orders. ordersFrame = frame + LobbyInfo.GlobalSettings.OrderLatency; diff --git a/OpenRA.Game/Server/ServerOrder.cs b/OpenRA.Game/Server/ServerOrder.cs index 0ecbcfa3cf..818e6b19de 100644 --- a/OpenRA.Game/Server/ServerOrder.cs +++ b/OpenRA.Game/Server/ServerOrder.cs @@ -49,7 +49,7 @@ namespace OpenRA.Server public byte[] Serialize() { - var ms = new MemoryStream(); + var ms = new MemoryStream(1 + Name.Length + 1 + Data.Length + 1); var bw = new BinaryWriter(ms); bw.Write((byte)0xfe); diff --git a/OpenRA.Mods.Cnc/FileSystem/MixFile.cs b/OpenRA.Mods.Cnc/FileSystem/MixFile.cs index 3fab1ccb94..77508d5ef6 100644 --- a/OpenRA.Mods.Cnc/FileSystem/MixFile.cs +++ b/OpenRA.Mods.Cnc/FileSystem/MixFile.cs @@ -150,7 +150,7 @@ namespace OpenRA.Mods.Cnc.FileSystem { var decrypted = fish.Decrypt(h); - var ms = new MemoryStream(); + var ms = new MemoryStream(decrypted.Length * 4); var writer = new BinaryWriter(ms); foreach (var t in decrypted) writer.Write(t);