内存流对ram/memoryc#wpf有多大影响?
How much impact does memory stream have on ram/memory c# wpf?
我目前对我的应用程序很困惑 :( 。我的应用程序占用了太多内存..
基本上我的应用程序是一个 WPF 应用程序,它有 3-4 windows 和几个页面,每个页面都是 opened/displayed when/as required.Each window/page 有几个 Image
控件来显示 images.To 检索图像(从资源),我正在使用以下功能:
public BitmapImage LoadImage(Uri uri, bool LoadOnMemory, int Pixel)
{
if (LoadOnMemory == true)
{
System.Windows.Resources.StreamResourceInfo sri = Application.GetResourceStream(uri);
System.IO.BinaryReader binReader = new System.IO.BinaryReader(sri.Stream);
byte[] buffer = binReader.ReadBytes(sri.Stream.Length);
using (MemoryStream memoryStream = new MemoryStream(buffer))
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.Default;
bi.CreateOptions = BitmapCreateOptions.None;
bi.StreamSource = memoryStream;
bi.DecodePixelWidth = Pixel;
bi.EndInit();
bi.Freeze();
return bi;
}
}
else
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.Default;
bi.CreateOptions = BitmapCreateOptions.None;
bi.UriSource = uri;
bi.DecodePixelWidth = Pixel;
bi.EndInit();
bi.Freeze();
return bi;
}
}
我可能总共有 20 张图片,要加载每张图片,该函数称为设置 Pixel
到 30(或有时 40)和 LoadOnMemory
到 True
。我的启动 window 有 2 个图像和一个 TextBlock
,调用相同的函数来加载两个图像。
我的应用一启动,在 任务管理器 中,我看到即使启动画面也只有 2-3 行代码来加载 MainWindow
正在消耗 105+ mb 的 RAM.When 我的 MainWindow
负载,RAM/Memory 的消耗达到 200+ mb.The main window 调用函数几次因为 MainWindow
中几乎有 10 张图片。从那时起,无论我打开多少张 Page
s 或 Window
s 以及任何数量的图像,RAM 的消耗都保持 same.It,出于某种原因,没有超过 220+ mb。
我怀疑我的函数使用 MemoryStream
,这可能是内存消耗如此巨大的原因。
但后来我创建了一个没有代码隐藏的虚拟 window,只有一个空白 window 并启动了我的应用程序......即使是空白 window 也消耗 100 + mb 内存!!
但是虚拟 window 不是我关心的问题,我的问题是,例如,如果我的应用程序有大约 20 张图像并且每个图像都是使用该函数加载的(或者我应该说内存流),如何它对公羊有多大影响? (尽管我可以看到它使用了将近 200+ mb)。我的函数不会在应用程序中引起任何 lag/performance 问题,但我只需要知道该函数是否导致如此巨大的内存消耗?
更新:很抱歉提供有关空白 window
的误导性信息
直到现在我是 运行 VS 中的应用程序,所以内存的总消耗实际上是 Intellitrace(消耗超过 30mb) 的总和和 空白 window(最大 15-20 mb...
最后一个问题,因为我也更新了代码,哪个更好?代码的第二部分(不使用 memorystream
)或第一部分(使用 memoryStream
)关于应用程序的性能和内存消耗?
当您可以直接从 StreamResourceInfo 的 Stream 加载 BitmapImage 时,您当然不需要中间 MemoryStream:
private ImageSource LoadImage(Uri resourceUri, int pixelWidth)
{
var resource = Application.GetResourceStream(resourceUri);
var bitmap = new BitmapImage();
using (var stream = resource.Stream)
{
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.DecodePixelWidth = pixelWidth;
bitmap.EndInit();
bitmap.Freeze();
}
return bitmap;
}
然而,你根本不需要使用 Stream,这显然更简单:
private ImageSource LoadImage(Uri resourceUri, int pixelWidth)
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.UriSource = resourceUri;
bitmap.DecodePixelWidth = pixelWidth;
bitmap.EndInit();
bitmap.Freeze();
return bitmap;
}
我目前对我的应用程序很困惑 :( 。我的应用程序占用了太多内存..
基本上我的应用程序是一个 WPF 应用程序,它有 3-4 windows 和几个页面,每个页面都是 opened/displayed when/as required.Each window/page 有几个 Image
控件来显示 images.To 检索图像(从资源),我正在使用以下功能:
public BitmapImage LoadImage(Uri uri, bool LoadOnMemory, int Pixel)
{
if (LoadOnMemory == true)
{
System.Windows.Resources.StreamResourceInfo sri = Application.GetResourceStream(uri);
System.IO.BinaryReader binReader = new System.IO.BinaryReader(sri.Stream);
byte[] buffer = binReader.ReadBytes(sri.Stream.Length);
using (MemoryStream memoryStream = new MemoryStream(buffer))
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.Default;
bi.CreateOptions = BitmapCreateOptions.None;
bi.StreamSource = memoryStream;
bi.DecodePixelWidth = Pixel;
bi.EndInit();
bi.Freeze();
return bi;
}
}
else
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.Default;
bi.CreateOptions = BitmapCreateOptions.None;
bi.UriSource = uri;
bi.DecodePixelWidth = Pixel;
bi.EndInit();
bi.Freeze();
return bi;
}
}
我可能总共有 20 张图片,要加载每张图片,该函数称为设置 Pixel
到 30(或有时 40)和 LoadOnMemory
到 True
。我的启动 window 有 2 个图像和一个 TextBlock
,调用相同的函数来加载两个图像。
我的应用一启动,在 任务管理器 中,我看到即使启动画面也只有 2-3 行代码来加载 MainWindow
正在消耗 105+ mb 的 RAM.When 我的 MainWindow
负载,RAM/Memory 的消耗达到 200+ mb.The main window 调用函数几次因为 MainWindow
中几乎有 10 张图片。从那时起,无论我打开多少张 Page
s 或 Window
s 以及任何数量的图像,RAM 的消耗都保持 same.It,出于某种原因,没有超过 220+ mb。
我怀疑我的函数使用 MemoryStream
,这可能是内存消耗如此巨大的原因。
但后来我创建了一个没有代码隐藏的虚拟 window,只有一个空白 window 并启动了我的应用程序......即使是空白 window 也消耗 100 + mb 内存!!
但是虚拟 window 不是我关心的问题,我的问题是,例如,如果我的应用程序有大约 20 张图像并且每个图像都是使用该函数加载的(或者我应该说内存流),如何它对公羊有多大影响? (尽管我可以看到它使用了将近 200+ mb)。我的函数不会在应用程序中引起任何 lag/performance 问题,但我只需要知道该函数是否导致如此巨大的内存消耗?
更新:很抱歉提供有关空白 window
的误导性信息直到现在我是 运行 VS 中的应用程序,所以内存的总消耗实际上是 Intellitrace(消耗超过 30mb) 的总和和 空白 window(最大 15-20 mb...
最后一个问题,因为我也更新了代码,哪个更好?代码的第二部分(不使用 memorystream
)或第一部分(使用 memoryStream
)关于应用程序的性能和内存消耗?
当您可以直接从 StreamResourceInfo 的 Stream 加载 BitmapImage 时,您当然不需要中间 MemoryStream:
private ImageSource LoadImage(Uri resourceUri, int pixelWidth)
{
var resource = Application.GetResourceStream(resourceUri);
var bitmap = new BitmapImage();
using (var stream = resource.Stream)
{
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.DecodePixelWidth = pixelWidth;
bitmap.EndInit();
bitmap.Freeze();
}
return bitmap;
}
然而,你根本不需要使用 Stream,这显然更简单:
private ImageSource LoadImage(Uri resourceUri, int pixelWidth)
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.UriSource = resourceUri;
bitmap.DecodePixelWidth = pixelWidth;
bitmap.EndInit();
bitmap.Freeze();
return bitmap;
}