From ba16eab570e94be6c6ef66f704162c7e977ea575 Mon Sep 17 00:00:00 2001 From: dexy Date: Sat, 30 Jul 2022 21:54:21 +1000 Subject: [PATCH] Fixed memory leak in RPF Explorer --- CodeWalker.Core/GameFiles/RpfFile.cs | 40 +++++++++++--------- CodeWalker/Rendering/DirectX/DXManager.cs | 7 ++++ CodeWalker/Rendering/RenderableCache.cs | 1 + CodeWalker/Rendering/ShaderManager.cs | 4 ++ CodeWalker/Rendering/Shaders/BasicShader.cs | 1 + CodeWalker/Rendering/Shaders/CloudsShader.cs | 1 + CodeWalker/Rendering/Shaders/ShadowShader.cs | 5 +++ 7 files changed, 41 insertions(+), 18 deletions(-) diff --git a/CodeWalker.Core/GameFiles/RpfFile.cs b/CodeWalker.Core/GameFiles/RpfFile.cs index 3ffc246..ad4178a 100644 --- a/CodeWalker.Core/GameFiles/RpfFile.cs +++ b/CodeWalker.Core/GameFiles/RpfFile.cs @@ -898,19 +898,21 @@ namespace CodeWalker.GameFiles { using (DeflateStream ds = new DeflateStream(new MemoryStream(bytes), CompressionMode.Decompress)) { - MemoryStream outstr = new MemoryStream(); - ds.CopyTo(outstr); - byte[] deflated = outstr.GetBuffer(); - byte[] outbuf = new byte[outstr.Length]; //need to copy to the right size buffer for output. - Array.Copy(deflated, outbuf, outbuf.Length); - - if (outbuf.Length <= bytes.Length) + using (var outstr = new MemoryStream()) { - LastError = "Warning: Decompressed data was smaller than compressed data..."; - //return null; //could still be OK for tiny things! - } + ds.CopyTo(outstr); + byte[] deflated = outstr.GetBuffer(); + byte[] outbuf = new byte[outstr.Length]; //need to copy to the right size buffer for output. + Buffer.BlockCopy(deflated, 0, outbuf, 0, outbuf.Length); - return outbuf; + if (outbuf.Length <= bytes.Length) + { + LastError = "Warning: Decompressed data was smaller than compressed data..."; + //return null; //could still be OK for tiny things! + } + + return outbuf; + } } } catch (Exception ex) @@ -924,13 +926,15 @@ namespace CodeWalker.GameFiles { using (MemoryStream ms = new MemoryStream()) { - DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress, true); - ds.Write(data, 0, data.Length); - ds.Close(); - byte[] deflated = ms.GetBuffer(); - byte[] outbuf = new byte[ms.Length]; //need to copy to the right size buffer... - Array.Copy(deflated, outbuf, outbuf.Length); - return outbuf; + using (var ds = new DeflateStream(ms, CompressionMode.Compress, true)) + { + ds.Write(data, 0, data.Length); + ds.Close(); + byte[] deflated = ms.GetBuffer(); + byte[] outbuf = new byte[ms.Length]; //need to copy to the right size buffer... + Buffer.BlockCopy(deflated, 0, outbuf, 0, outbuf.Length); + return outbuf; + } } } diff --git a/CodeWalker/Rendering/DirectX/DXManager.cs b/CodeWalker/Rendering/DirectX/DXManager.cs index 0a0e5ee..d941cea 100644 --- a/CodeWalker/Rendering/DirectX/DXManager.cs +++ b/CodeWalker/Rendering/DirectX/DXManager.cs @@ -46,6 +46,7 @@ namespace CodeWalker.Rendering try { + //SharpDX.Configuration.EnableObjectTracking = true; SwapChainDescription scd = new SwapChainDescription() { @@ -154,12 +155,18 @@ namespace CodeWalker.Rendering dxform.CleanupScene(); + if (context != null) context.ClearState(); + //dipose of all objects if (depthview != null) depthview.Dispose(); if (depthbuffer != null) depthbuffer.Dispose(); if (targetview != null) targetview.Dispose(); if (backbuffer != null) backbuffer.Dispose(); if (swapchain != null) swapchain.Dispose(); + if (context != null) context.Dispose(); + + //var objs = SharpDX.Diagnostics.ObjectTracker.FindActiveObjects(); + if (device != null) device.Dispose(); GC.Collect(); diff --git a/CodeWalker/Rendering/RenderableCache.cs b/CodeWalker/Rendering/RenderableCache.cs index 9f487aa..4b63cab 100644 --- a/CodeWalker/Rendering/RenderableCache.cs +++ b/CodeWalker/Rendering/RenderableCache.cs @@ -323,6 +323,7 @@ namespace CodeWalker.Rendering cacheitems.Clear(); itemsToUnload = new ConcurrentQueue(); keysToInvalidate = new ConcurrentQueue(); + CacheUse = 0; } diff --git a/CodeWalker/Rendering/ShaderManager.cs b/CodeWalker/Rendering/ShaderManager.cs index f1ff7af..98a1ef7 100644 --- a/CodeWalker/Rendering/ShaderManager.cs +++ b/CodeWalker/Rendering/ShaderManager.cs @@ -235,6 +235,8 @@ namespace CodeWalker.Rendering bsAdd.Dispose(); rsSolid.Dispose(); rsWireframe.Dispose(); + rsSolidDblSided.Dispose(); + rsWireframeDblSided.Dispose(); Widgets.Dispose(); Paths.Dispose(); @@ -284,6 +286,8 @@ namespace CodeWalker.Rendering public void BeginFrame(DeviceContext context, double currentRealTime, float elapsedTime) { + if (disposed) return; + CurrentRealTime = currentRealTime; CurrentElapsedTime = elapsedTime; diff --git a/CodeWalker/Rendering/Shaders/BasicShader.cs b/CodeWalker/Rendering/Shaders/BasicShader.cs index 687163e..e219448 100644 --- a/CodeWalker/Rendering/Shaders/BasicShader.cs +++ b/CodeWalker/Rendering/Shaders/BasicShader.cs @@ -1025,6 +1025,7 @@ namespace CodeWalker.Rendering texsampler.Dispose(); texsampleranis.Dispose(); texsamplertnt.Dispose(); + texsamplertntyft.Dispose(); foreach (InputLayout layout in layouts.Values) { diff --git a/CodeWalker/Rendering/Shaders/CloudsShader.cs b/CodeWalker/Rendering/Shaders/CloudsShader.cs index 075f1a9..bf680eb 100644 --- a/CodeWalker/Rendering/Shaders/CloudsShader.cs +++ b/CodeWalker/Rendering/Shaders/CloudsShader.cs @@ -340,6 +340,7 @@ namespace CodeWalker.Rendering texsampler.Dispose(); + texsampleranis.Dispose(); layout.Dispose(); diff --git a/CodeWalker/Rendering/Shaders/ShadowShader.cs b/CodeWalker/Rendering/Shaders/ShadowShader.cs index 8da2a16..aefb574 100644 --- a/CodeWalker/Rendering/Shaders/ShadowShader.cs +++ b/CodeWalker/Rendering/Shaders/ShadowShader.cs @@ -415,6 +415,11 @@ namespace CodeWalker.Rendering texsampler.Dispose(); texsampler = null; } + if (texsamplerc != null) + { + texsamplerc.Dispose(); + texsamplerc = null; + } foreach (InputLayout layout in layouts.Values) {