WinRT 如何处理 BitmapImage 和 Image 内存?

25

我刚开始学习使用C#编写Windows商店应用程序,并尝试理解如何处理图像内存。我的应用程序非常简单:

1)它使用Windows.UI.Xaml.Media.Imaging.BitmapImage对象从文件引用一个位图,然后将其作为Windows.UI.Xaml.Controls.Image对象的源。在我的情况下,磁盘上的图像具有比屏幕上显示的尺寸更大的尺寸,因此系统正在对其进行缩放。

我的问题是,WinRT如何处理图像的内存?我使用了vmmap工具,并在映射文件部分中找到了我的图像文件条目。我猜这意味着该文件的原始字节已完全加载到内存中。由于这是一个JPG文件,这些字节必须被解码为像素字节。从我的测试中看来,设置BitmapImage的UriSource实际上不会导致进行任何处理,因为它需要0毫秒,而实际上存在一些惰性加载。

那么问题是:哪个对象是未压缩未缩放的像素数据的控制器?哪个对象是绘制在屏幕上的缩放像素数据的控制器?是否有可以轻松显示这个的工具?在Java世界中,我使用Eclipse内存分析器工具。我尝试使用PerfView,但结果对我来说毫无意义,似乎该工具是用于分析性能的。

更新

在BUILD会议上,团队讨论了Windows Performance Toolkit。我从未听过任何人提到PerfView,因此我认为WPT是分析内存和性能的最新最好的工具,下面是链接:

http://msdn.microsoft.com/en-us/performance/cc825801.aspx


2
这背后有一个相当陡峭的API,从这里开始阅读:http://msdn.microsoft.com/en-us/library/windows/desktop/ee719902%28v=vs.85%29.aspx - Hans Passant
我相信大多数图像源对象都是在InMemoryRandomAccessStream或类似的东西后面支持的。不过,你可以尝试使用PerfView/PerfMon来了解更多信息。 - Nate Diamond
1
我不太记得了,但是 Image 控件不是会根据其大小设置来缩放源吗?例如,当你将一个控件放在 XAML 窗口中时,图像控件作为框架元素的大小设置为 800x600,而实际图像大小为 1920x1080? - Paul Wade
你的假设“由于这是JPG文件,这些字节必须解码为像素字节”可能是错误的。在Windows 8.1中,有时图形硬件会从部分解压缩的流中呈现JPEG图像。请参见http://blogs.msdn.com/b/ie/archive/2013/09/12/using-hardware-to-decode-and-load-jpg-images-up-to-45-faster-in-internet-explorer-11.aspx获取更多信息。 - Kris Vandermotten
1个回答

1
一个简短的回答最可能是“最佳状态”。不是在卖弄聪明,只是因为有很多不同的系统。其中一个提到了硬件加速,您还可以考虑核心数量、显示内存、磁盘速度、监视器位深度和分辨率等等,列表还有很长。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接