我的GUI有部分很慢

5
我在GUI上遇到了问题。 我的GUI有多个部分。 第一个部分是一个图像(从500 x 500到3000 x 3000,每秒最多更新4次) 第二个部分是主菜单 第三个部分有关于图像的选项按钮。我不会一次显示所有选项,我通过滚动多个菜单并仅渲染可见的菜单。(例如选项之一是图像的像素大小) 我在Viewbox中显示图像,该盒子大小为800x800像素。我使用Stretch="{Binding Path=StretchMode}"将图像拉伸到盒子内部。 我收到的图像是某种流式传输。我每秒收到多个图像。
现在,当我显示一个图像时,第一个GUI部分很好地工作(无论图像大小如何),但其他部分有时会出现严重的帧率下降。以下是一些示例:
示例1:
图像大小为500x500像素。我可以不掉帧地工作,并且整个GUI正确更新。
示例2:
图像大小为1500x1500像素。我可以不掉帧地工作,并且整个GUI正确更新。
示例3:
图像大小为2500x2500像素。图像更新快,但GUI的其余部分将从60 fps掉帧到fps,甚至有时到1 fps。
对于这个问题,我的想法是:
硬件达到了极限。但是通过任务管理器和Visual Studios的CPU / RAM分析看起来没问题。
GUI的渲染量太大,因为3000x3000很大,每秒4次也不慢。通过测试加载(我从hdd驱动器中加载它们)的3000x3000图像(相同数据类型),它可以快速且没有问题。
一次更改了太多GUI。我尝试了只有5个更新的软件。仍然有同样的问题。
Microsoft Prism事件没有出现。这也不是因为它位于控制器内部,并在更改时引发更改。 (我有一个写日志文件的记录器,它比GUI实际更改的次数更高)
使用不同的数据类型。可能会有变化,但我尝试了几种。(BitmapSource,BitmapImage和WriteableBitmap)
将某些渲染选项外包给另一个线程。仍然没有改变。
我希望您能给我一些想法,为什么GUI会有这种行为。 如果您需要代码,请告诉我。

我没有使用虚拟机。 这个问题出现在Windows 7 64位和Windows 8.1 64位上(未在Windows 10上测试过)。 我的硬件不同。这个问题出现在我的笔记本电脑(Intel i7-4702MQ @2.2 Ghz,8 gb ddr ram,intel board graphics)和工作电脑上,规格各异(最高的是:Intel Xeon with 3.5 Ghz,128 GB DDR4 Ram和Titan X以及4k显示器)。


过去在prism中已经发现了一些内存泄漏问题http://compositewpf.codeplex.com/workitem/4065。据我所知,它们都已经修复了,但可能还有其他的问题。如果你有很多时间,可以试着削减一些prism的自动化功能(比如视图模型映射)进行测试,看看是否会有任何变化。特别是区域管理器和任何事件驱动的功能都很容易导致内存泄漏。 - Mafii
你在一台带有集成显卡的笔记本电脑上展示3k*3x的图片?你确定你的分辨率足以展示这样的图片吗?也许你感觉的缓慢是因为每次都需要将这样大的图片缩放以适应你的分辨率? - nvoigt
如果问题只出现在我的笔记本电脑上,我会同意你的看法,但是这个问题也出现在一个有两个内置Intel Titan X和四个显示器的台式电脑上。我每次还会重新调整图像大小(我也会在问题中添加这个信息)。 - Evosoul
就像我说的那样,每次我都会重新调整图像大小以完全查看它。我使用一个带有800x800和拉伸模式的ViewBox。它会将800x800内的每个图像进行拉伸。当我放大时,它会变得更加详细。 我的笔记本电脑分辨率为1920x1080,在4k上为3840x2160。 - Evosoul
1
我用大图像运行了几个小时的软件,RAM从未开始增长,因此我认为内存泄漏(至少是可见的)不是问题。 - Evosoul
显示剩余2条评论
1个回答

0

编辑:抱歉,我的分数不够高,无法在评论区发表内容,所以在这里发表类似评论的内容。

编辑1:建议使用Sysinternals的Process Explorer来查看是否有任何视频资源消耗过高。在Process Explorer中有一个选项卡/区域用于查看图形资源。在Process Explorer中,您可以执行“选择列”并添加GPU资源以便轻松查看。这可能是一个不错的尝试角度。

我猜测我们现在正在处理一个

使用DPC数据的ETW跟踪可能会有所帮助。此外,您没有提到您是否在虚拟机中,虚拟机会使任务管理器反映CPU上的不准确资源消耗。

收集此类跟踪的示例在此处:https://blogs.technet.microsoft.com/jeff_stokes/2012/09/18/how-to-collect-a-trace-for-audio-or-video-problems-in-windows-7/

无论如何,我猜想你正在关注内核驱动程序或IPC/DPC问题,而不仅仅是原始CPU消耗。我认为需要提供更多的数据(硬件规格、使用的操作系统、虚拟机/非虚拟机)。

1
我会调查这个问题!我还添加了一些关于出现错误的环境信息。 - Evosoul
1
我无法使用链接中提到的“Windows性能工具包”,因为我是在Windows 8.1下开发。我使用Visual Studio进行了一些分析,GPU没有工作,而CPU则在做所有的工作。如果可用的话,WPF应该使用GPU(我在关于硬件加速的这个链接中阅读到了这一点https://dev59.com/X3VC5IYBdhLWcg3w51lv)。是否有某个特定的东西需要激活GPU呢? - Evosoul
抱歉,我看到这个消息晚了。你绝对可以在8.1上使用ADK来进行10的开发,事实上我们推荐这样做。在WPT中有一个场景可以捕获GPU活动,它被称为“视频故障”,另外一种方式是在“资源分析”中选择“GPU活动”。 - Jeff Stokes

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