Эх сурвалжийг харах

Fixed memory leak. Formatting.

NathanSweet 12 жил өмнө
parent
commit
d641dbc414
1 өөрчлөгдсөн 84 нэмэгдсэн , 93 устгасан
  1. 84 93
      spine-xna/src/Util.cs

+ 84 - 93
spine-xna/src/Util.cs

@@ -6,10 +6,10 @@
  * modification, are permitted provided that the following conditions are met:
  * 
  * 1. Redistributions of source code must retain the above copyright notice, this
- *    list of conditions and the following disclaimer.
+ *	list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
+ *	this list of conditions and the following disclaimer in the documentation
+ *	and/or other materials provided with the distribution.
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@@ -23,105 +23,96 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  ******************************************************************************/
 
-using System;
-using System.IO;
-using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Graphics;
-
+using System;
+using System.IO;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+
 #if WINDOWS_STOREAPP
 using System.Threading.Tasks;
 using Windows.Storage;
-#endif
-
+#endif
+
 namespace Spine {
 
-    static public class Util {
+	static public class Util {
 #if WINDOWS_STOREAPP
-		private static async Task<Texture2D> LoadFile(GraphicsDevice device, String path)
-        {
-            var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
-
-            var file = await folder.GetFileAsync(path).AsTask().ConfigureAwait(false);
+		private static async Task<Texture2D> LoadFile(GraphicsDevice device, String path) {
+			var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
+			var file = await folder.GetFileAsync(path).AsTask().ConfigureAwait(false);
+			try {
+				return Util.LoadTexture(device, await file.OpenStreamForReadAsync().ConfigureAwait(false));
+			} catch (Exception ex) {
+				throw new Exception("Error reading texture file: " + path, ex);
+			}
+		}
 
-            try
-            {
-                return Util.LoadTexture(device, await file.OpenStreamForReadAsync().ConfigureAwait(false));
-            }
-            catch (Exception ex)
-            {
-                throw new Exception("Error reading texture file: " + path, ex);
-            }
-        }
-
-        static public Texture2D LoadTexture (GraphicsDevice device, String path)
-        {
-            return LoadFile(device, path).Result;
-		}
-#else
-		static public Texture2D LoadTexture (GraphicsDevice device, String path) {
-			using (Stream input = new FileStream(path, FileMode.Open, FileAccess.Read)) {
-				try {
-					return Util.LoadTexture(device, input);
-				} catch (Exception ex) {
-					throw new Exception("Error reading texture file: " + path, ex);
-				}
-			}
+		static public Texture2D LoadTexture (GraphicsDevice device, String path) {
+			return LoadFile(device, path).Result;
 		}
-
+#else
+		static public Texture2D LoadTexture (GraphicsDevice device, String path) {
+			using (Stream input = new FileStream(path, FileMode.Open, FileAccess.Read)) {
+				try {
+					return Util.LoadTexture(device, input);
+				} catch (Exception ex) {
+					throw new Exception("Error reading texture file: " + path, ex);
+				}
+			}
+		}
 #endif
-		static public Texture2D LoadTexture (GraphicsDevice device, Stream input) {
-			Texture2D file = Texture2D.FromStream(device, input);
-
-			// Setup a render target to hold our final texture which will have premulitplied alpha values
-			RenderTarget2D result = new RenderTarget2D(device, file.Width, file.Height);
-			device.SetRenderTarget(result);
-			device.Clear(Color.Black);
-
-			// Multiply each color by the source alpha, and write in just the color values into the final texture
-			BlendState blendColor = new BlendState();
-			blendColor.ColorWriteChannels = ColorWriteChannels.Red | ColorWriteChannels.Green | ColorWriteChannels.Blue;
-			blendColor.AlphaDestinationBlend = Blend.Zero;
-			blendColor.ColorDestinationBlend = Blend.Zero;
-			blendColor.AlphaSourceBlend = Blend.SourceAlpha;
-			blendColor.ColorSourceBlend = Blend.SourceAlpha;
-
-			SpriteBatch spriteBatch = new SpriteBatch(device);
-			spriteBatch.Begin(SpriteSortMode.Immediate, blendColor);
-			spriteBatch.Draw(file, file.Bounds, Color.White);
-			spriteBatch.End();
-
-			// Now copy over the alpha values from the PNG source texture to the final one, without multiplying them
-			BlendState blendAlpha = new BlendState();
-			blendAlpha.ColorWriteChannels = ColorWriteChannels.Alpha;
-			blendAlpha.AlphaDestinationBlend = Blend.Zero;
-			blendAlpha.ColorDestinationBlend = Blend.Zero;
-			blendAlpha.AlphaSourceBlend = Blend.One;
-			blendAlpha.ColorSourceBlend = Blend.One;
-
-			spriteBatch.Begin(SpriteSortMode.Immediate, blendAlpha);
-			spriteBatch.Draw(file, file.Bounds, Color.White);
-			spriteBatch.End();
-
-			// Release the GPU back to drawing to the screen
-			device.SetRenderTarget(null);
 
+		static public Texture2D LoadTexture (GraphicsDevice device, Stream input) {
+			Texture2D file = Texture2D.FromStream(device, input);
+
+			// Setup a render target to hold our final texture which will have premulitplied alpha values
+			RenderTarget2D result = new RenderTarget2D(device, file.Width, file.Height);
+			device.SetRenderTarget(result);
+			device.Clear(Color.Black);
+
+			// Multiply each color by the source alpha, and write in just the color values into the final texture
+			BlendState blendColor = new BlendState();
+			blendColor.ColorWriteChannels = ColorWriteChannels.Red | ColorWriteChannels.Green | ColorWriteChannels.Blue;
+			blendColor.AlphaDestinationBlend = Blend.Zero;
+			blendColor.ColorDestinationBlend = Blend.Zero;
+			blendColor.AlphaSourceBlend = Blend.SourceAlpha;
+			blendColor.ColorSourceBlend = Blend.SourceAlpha;
+
+			SpriteBatch spriteBatch = new SpriteBatch(device);
+			spriteBatch.Begin(SpriteSortMode.Immediate, blendColor);
+			spriteBatch.Draw(file, file.Bounds, Color.White);
+			spriteBatch.End();
+
+			// Now copy over the alpha values from the PNG source texture to the final one, without multiplying them
+			BlendState blendAlpha = new BlendState();
+			blendAlpha.ColorWriteChannels = ColorWriteChannels.Alpha;
+			blendAlpha.AlphaDestinationBlend = Blend.Zero;
+			blendAlpha.ColorDestinationBlend = Blend.Zero;
+			blendAlpha.AlphaSourceBlend = Blend.One;
+			blendAlpha.ColorSourceBlend = Blend.One;
+
+			spriteBatch.Begin(SpriteSortMode.Immediate, blendAlpha);
+			spriteBatch.Draw(file, file.Bounds, Color.White);
+			spriteBatch.End();
+
+			// Release the GPU back to drawing to the screen.
+			device.SetRenderTarget(null);
+			spriteBatch.Dispose();
+			file.Dispose();
+
 #if IOS
 			return result as Texture2D;
-#else
-			// RenderTarget2D are volatile and will be lost on screen resolution changes.
-			// So instead of using this directly, we create a non-voliate Texture2D.
-			// This is computationally slower, but should be safe as long as it is done
-			// on load.
-			Texture2D resultTexture = new Texture2D(device, file.Width, file.Height);
-			Color[] resultContent = new Color[Convert.ToInt32(file.Width * file.Height)];
-			result.GetData(resultContent);
-			resultTexture.SetData(resultContent);
-	
-			// Dispose of the RenderTarget2D immediately.
-            result.Dispose();
-      			
-			return resultTexture;
-#endif
-		}
-	}
-}
+#else
+			// RenderTarget2D are volatile and will be lost on screen resolution changes.
+			// So instead of using this directly, we create a non-voliate Texture2D.
+			// This is computationally slower, but should be safe as long as it is done on load.
+			Texture2D resultTexture = new Texture2D(device, file.Width, file.Height);
+			Color[] resultContent = new Color[Convert.ToInt32(file.Width * file.Height)];
+			result.GetData(resultContent);
+			resultTexture.SetData(resultContent);
+			result.Dispose(); // Dispose of the RenderTarget2D immediately.
+			return resultTexture;
+#endif
+		}
+	}
+}