【问题标题】:WP8 WriteableBitmap constructor keeps a lot of memoryWP8 WriteableBitmap 构造函数保留大量内存
【发布时间】:2013-10-21 10:19:04
【问题描述】:

我正在尝试使用 WriteableBitmap 对象,因为我需要它来旋转图像并将图像保存到我的应用程序的独立存储中。

问题是,它使用了太多内存,最终导致内存不足异常。

这是我的App的内存使用情况图片,图片链接here方便查看。

这是我使用 WriteableBitmap 的一个实例:

        WriteableBitmap picture = new WriteableBitmap(PictureCanvas, null);

        using (var memoryStream = new MemoryStream())
        {
            picture.SaveJpeg(memoryStream, picture.PixelWidth, picture.PixelHeight, 0, 100);

            using (var myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(Globals.OVERLAY_FILE_NAME, FileMode.Create, myIsolatedStorage))
                {
                    fileStream.Write(memoryStream.ToArray(), 0, memoryStream.ToArray().Length);
                    fileStream.Close();
                }
            }
        }

        picture = picture.Crop(0, 0, 1, 1);

我尝试裁剪图像以使其占用更少的内存,但这无济于事。

我正在使用 WriteableBitmap 扩展库 here,在首页它提到了一个 Dispose() 方法,但我在我的应用程序中没有看到它。

如果有人能告诉我如何解决这个问题或指出我可以找到可能的解决方案的地方,那就太棒了!

【问题讨论】:

    标签: c# wpf memory-management windows-phone-8 writeablebitmap


    【解决方案1】:

    我有a similar issue 并且仍在调查,但至少我可以给出一个小提示:如果可能的话,摆脱 MemoryStream 并像这样直接写入 fileStream:

        WriteableBitmap picture = new WriteableBitmap(PictureCanvas, null);
        using (var myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(Globals.OVERLAY_FILE_NAME, FileMode.Create, myIsolatedStorage))
        {
            picture.SaveJpeg(fileStream, picture.PixelWidth, picture.PixelHeight, 0, 100)
        }
    

    这应该会给你买一些内存。

    【讨论】:

    • 我可以通过将 writeableBitmap 设置为 null 来减少内存使用量。现在我没有在我的问题中包含这个,但是我从视频刷中得到了内存泄漏,这实际上导致了我的泄漏。我建议设置为空。我还查看了您的代码,您处理了您制作的流,但不要关闭它们。也许这会有所帮助?我还建议制作一个仅使用 writeableBitmap 制作图像的小应用程序,然后检查内存使用情况并继续构建您的小样本,直到发现泄漏为止。
    • 谢谢克里斯!尽管我确实注意到了,但我瞥了一眼刷子的归零。处理流会自动关闭它,使用 Reflector、IL Spy 或任何其他反编译工具检查它。这是多余的。
    • 不过,请试试这个东西,直接写入fileStream,避开MemoryStream。 MemoryStream 使用内部字节数组,这些字节数组被重新分配了很多(每次溢出时翻倍)并产生大量垃圾。最后,我认为它没有任何目的..
    猜你喜欢
    • 2015-03-07
    • 2016-06-13
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多