Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 位图性能优化模式_Wpf_Performance_Optimization_Bitmap_Design Patterns - Fatal编程技术网

Wpf 位图性能优化模式

Wpf 位图性能优化模式,wpf,performance,optimization,bitmap,design-patterns,Wpf,Performance,Optimization,Bitmap,Design Patterns,我发现了几个用于优化WPF中位图处理的模式。然而,我不知道何时使用每种模式。由于我认为这是一个常见的问题,我总结了我的理解和猜测,并请求您的帮助。如果你能添加模式,解释它们之间的区别,解释它们是使用CPU还是GPU,并教何时使用每种模式以及如何组合模式,这将是一个巨大的帮助 上下文–图像“网格”场景: 我的应用程序必须显示许多位图图像。图像在屏幕上以行和列的网格形式显示(不一定是网格或UniformGrid类,想想Window Media Player的相册视图)。图像可能在不同的网格单元之间移

我发现了几个用于优化WPF中位图处理的模式。然而,我不知道何时使用每种模式。由于我认为这是一个常见的问题,我总结了我的理解和猜测,并请求您的帮助。如果你能添加模式,解释它们之间的区别,解释它们是使用CPU还是GPU,并教何时使用每种模式以及如何组合模式,这将是一个巨大的帮助

上下文–图像“网格”场景:

我的应用程序必须显示许多位图图像。图像在屏幕上以行和列的网格形式显示(不一定是网格或UniformGrid类,想想Window Media Player的相册视图)。图像可能在不同的网格单元之间移动。任意单元格中的某些图像可能会被其他图像替换。图像应该是可点击的,应该提供上下文菜单,应该是可选择的,可以拖动的,等等。换句话说,“将小错误合并成一个大位图”是不适用的,至少不是天真的

模式0:黑客

一定要将这些小错误组合成位图(如何?绘图上下文?),并将其用作背景。用带有空内容的图像覆盖,这些图像将处理点击、上下文菜单、事件等

优点是我们这里只讨论两个位图:当前显示的位图和应该替换它的位图。这应该很快。然而,我多年的经验使我面临危险。你的评论

模式1:减小图像大小

当您事先知道要调整大小的图像大小,并且准备为性能而丢失细节(颜色)时,这是一个很容易解决的问题:

  • 使用BitmapImage.DecodePixelWidth减小位图大小
  • 使用FormatConvertedBitmap.DestinationFormat减少颜色信息
  • 设置控件的缩放行为设置Image.Stretch to Stretch.None
  • 将图像的SetBitmapScalingMode设置为LowQuality
  • 别动那家伙
  • 参见代码

    模式2:背景预取

    当您认为可以利用用户注视屏幕上的图像,并提前准备下一个要显示的图像时,此模式适用。除了内存开销之外,您的项目的缺点是它必须支持.Net Framework 4目标,而不仅仅是客户端配置文件,因此它可能需要在客户端上进行安装。您自己将不得不忍受异步编程的痛苦

    在此模式中,您可以创建所需数量的图像控件。当需要添加、移动或删除位图时,只能修改图像控件的位图源。BackgroundWorker任务负责预取位图源(可能使用上面的“减少图像大小”模式)并将其插入MemoryCache

    要使其工作,必须将BitmapImage的CacheOption设置为OnLoad,以便将工作卸载到后台工作程序

    模式3:绘图上下文

    这是微软支持部门的Sheldon Ziao在MSDN WPF论坛上提出的建议。有关DrawingContext的描述,请参见Adam Nathan的WPF 4 Unreleased第494页第15章“2D图形”。我不能说我明白。根据答案,我认为这将改进几何图形的处理,而不是位图。其次,我不认为这将支持图像的焦点和事件要求(我的缺点是没有在论坛上更好地解释这些要求),此外,我对本书的总结句感到担忧:“请注意,DrawingContext的使用不会改变您在保留模式系统中操作的事实。指定的绘图不会立即发生;命令将由WPF保留,直到需要为止。”这意味着,一旦偶数处理程序重新启动,我们就无法像“后台预取”那样利用并行性

    模式4:可写位图

    MSDN文档将其描述为一个双缓冲系统:UI线程更新缓冲区;WPF的渲染线程将其移动到视频内存

    其预期用途(请参阅)是用于在视频电影(如显示)中变化很大的位图。我不确定,但这可能会被黑客攻击,并与背景预取模式相结合,并在网格场景中使用

    模式5:缓存位图

    关于MSDN()的信息不多。在WPF forum archive()上解释说,“BitmapCache API旨在将内容(在硬件中呈现时)缓存在视频内存中,这意味着它驻留在您的GPU上。这节省了将内容绘制到屏幕时重新呈现内容的成本。”这似乎是一个好主意。但是,我不确定陷阱是什么以及如何使用它

    模式6:RenderTargetBitmap

    RenderTargetBitmap将视觉转换为位图。我不确定它是否与此处相关。请参阅

    编辑:关于Paul Hoenecke的问题:我写过“我的应用程序必须显示许多位图图像”。我没有提到我需要同时显示大约800幅图像

    您可以阅读我的SO问题和报告中涉及的性能问题

    我修改了模式1的描述,以强调图像控件不会被创建或删除的概念(除非我们想显示更大或更小的网格)。只有它们的源被设置为不同的、新的或空的位图源


    编辑:,由微软人事部提供一些答案。

    我在你的帖子中找不到一个具体的问题,除了就下面的方法征求意见。我不会声称我知道上面的一切,但我会告诉你我知道的