我们能够利用Silverlight的位图缓存来解决高CPU使用率问题,如下所述:
我们将EnableGPUAcceleration参数添加到< object>标签。为了将CPU使用率降低到合理的水平,我们不得不将CacheMode =“BitmapCache”添加到整个应用程序的根可视网格中。所以我想知道在位图缓存上依赖这么多是不是有任何缺点。如果它总是有益的,我认为默认情况下会启用它。
我发现这个类似的问题,AnthonyWJones给出了一个很好的答案:
所以一个缺点是它使用更多的视频RAM。我想这可能会使同时运行的其他图形密集型应用程序变得更糟。还有其他缺点吗?
如果显卡没有足够的视频RAM来缓存所有内容,我认为Silverlight会优雅地降级,只会使用更多的CPU周期来重新呈现UI。
谢谢你的帮助,
理查德
答案 0 :(得分:5)
在对位图缓存进行大量试验后,我们最终在应用程序中关闭了它。当你想要使用GPU在一块没有变化的UI上执行变换时,它可以很好地工作 - 例如,如果你有一个你想要动画,压缩,旋转等的图片,但是位图缓存/ GPU加速(在其当前实现中)如果您继续更新您想要缓存/操作的UI部分内的可视树,则会大大减慢速度。如果你只是在静态位图上移动,那么缓存它并使用GPU来加速它是有意义的。但是很多时候,你可能会在你标记为缓存的UI片段的某个视觉树下调整片段,如果发生这种情况,你需要每帧更新GPU的缓存,这是缓慢,缓慢,缓慢的。 / p>
换句话说,是否将其打开是否有意义完全取决于 你打开它,以及你的应用程序正在做什么。因此,我强烈建议,如果您使用位图缓存,或者遇到Silverlight UI出现性能问题,请(暂时)启用cache visualization和redraw regions。当你的应用程序打开时,它们看起来很时髦,但是当你看到你的用户界面正在做什么来咀嚼你所有的CPU时,它们是非常宝贵的。
答案 1 :(得分:1)
我没有看到你所描述的问题,但我相信你可以过度使用位图缓存。
比如说你有一个500x500'顶级'画布,它包含25个'sub'画布,每个100x100。让我们说我们正在更新每个子画布的内容/颜色等。让我们说有一个事件会移动屏幕上的顶部画布。如果所有子画布都以相同的间隔更改,那么仅对顶部画布进行位图缓存是有意义的。但是,如果子画布并非全部以相同的间隔变化,或者有时根本不变,那么在每个子画布上设置位图缓存可能会更有利。更进一步如果你的位图缓存了顶部和每个子画布,那么在缓存某些东西时可能会浪费周期而没有任何好处。
或者我走的路与你提出的完全不同?