首页 > 其他分享 >WPF性能优化:Freezable 对象

WPF性能优化:Freezable 对象

时间:2023-10-18 18:56:52浏览次数:37  
标签:冻结 Freezable 对象 Freeze freezable WPF 优化 属性

Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象。冻结一个对象意味着将其状态设置为只读,从而提高性能并允许在多线程环境中共享对象。

Freezable的应用

我们定义画刷资源的时候常常会这样写:

<SolidColorBrush x:Key="RedBrush" Color="Red" o:Freeze="True"/>

代码中的o:Freeze="True"其实就是使用FreezableFreeze方法冻结画刷,使之不可修改,系统不必监视该画刷对象,从而减少资源消耗。

o:Freeze="True"乍一看像附加属性,其实并不是的。Freeze属性是http://schemas.microsoft.com/winfx/2006/xaml/presentation/optionsXML命名空间中定义的唯一属性或其他编程元素。Freeze属性专门存在于此特殊命名空间中,以便在根元素声明中可以使用。处理 Freeze属性的功能专门内置于处理已编译应用程序的 XAML的XAML处理器中。

那是不是WPF中的所有资源都可以(需要)使用Freeze方法冻结来提高性能呢?

Freezable类通常用于WPF中的资源和动画,例如创建可重用的画刷、几何图形和动画。从Freezable继承的类型包括BrushTransformGeometry类。由于它们包含非托管资源,因此系统必须监视这些对象发生的修改,然后在原始对象发生更改时更新对应的非托管资源。即使实际上并未修改图形系统对象,系统仍必须消耗一些资源来监视该对象,以防更改它。

例如,假设创建一个SolidColorBrush画笔并用它来绘制按钮的背景。

<Window.Resources>
    <SolidColorBrush x:Key="RedBrush" Color="Red"/>
</Window.Resources>
<Button Background="{StaticResource RedBrush}"/>

呈现按钮时,WPF图形子系统使用你提供的信息来绘制一组像素,以创建按钮的外观。尽管使用纯色画笔来描述按钮的绘制方式,但纯色画笔实际上并没有进行绘制。图形系统为按钮和画笔生成快速、低级别的对象,实际显示在屏幕上的就是这些对象。
如果要修改画笔,则必须重新生成这些低级别对象。Freezable类使画笔能够找到生成的相应低级别对象并在更改时更新它们。

注意事项

并非每个Freezable对象都可以冻结。为避免引发InvalidOperationException,请在尝试冻结Freezable对象之前检查该对象的CanFreeze属性值,以确定是否可以将其冻结。如果满足以下任一条件,则无法冻结Freezable:

  • 它具有动画属性或数据绑定属性。
  • 它具有由动态资源设置的属性。
  • 它包含无法冻结的Freezable子对象。

Freezable对象调用Freeze方法冻结后,就无法解冻。修改冻结对象属性时会引发InvalidOperationException。但是,可以使用CloneCloneCurrentValue方法创建(深拷贝)解冻的副本。如果Freezable包含其他已冻结的 Freezable对象,它们也会被克隆并变为可修改。

无论使用哪种克隆方法,动画都不会复制到新的 Freezable。
由于无法对冻结的Freezable进行动画处理,因此使用Storyboard对其进行动画处理时,动画系统会自动创建冻结的Freezable对象的可修改克隆。为了消除克隆导致的性能开销,如果需要对对象进行动画处理,请让其保持解冻状态。

附加属性实现XAML中Freeze

上文中提到o:Freeze="True"并不是通过附加属性实现,而是内置于XAML处理器中实现。我们自己也可以通过附加属性的方式实现,代码如下:

public class PresentationOptionsAttach
{
    public static bool GetFreeze(Freezable freezable)
    {
        return (bool)freezable.GetValue(FreezeProperty);
    }

    public static void SetFreeze(Freezable freezable, bool value)
    {
        freezable.SetValue(FreezeProperty, value);
    }

    public static readonly DependencyProperty FreezeProperty =
        DependencyProperty.RegisterAttached("Freeze", typeof(bool), typeof(PresentationOptionsAttach), new PropertyMetadata(false, OnFreezeChanged));

    private static void OnFreezeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (DesignerProperties.GetIsInDesignMode(d)) return;

        if ((bool)e.NewValue)
        {
            Freezable freezable = d as Freezable;
            if (freezable.CanFreeze)
                freezable.Freeze();
        }
    }
}

小结

Freezable是一个我们既熟悉又陌生的类,熟悉是因为我们经常使用,陌生是因为很少关注其优化性能的机制以及需要注意的地方。本文简单介绍了Freezable优化性能的机制以及注意事项,并提供了通过附加属性的方式在XAML中冻结资源。

标签:冻结,Freezable,对象,Freeze,freezable,WPF,优化,属性
From: https://www.cnblogs.com/czwy/p/17773084.html

相关文章

  • 安防视频监控平台EasyCVR出现视频流播放卡顿情况,如何优化?
    视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼宇、校园、仓储等场景中。......
  • MySQL性能优化
    https://www.bilibili.com/video/BV17e411w7EM/?spm_id_from=333.788.recommend_more_video.0&vd_source=46d50b5d646b50dcb2a208d3946b1598......
  • 如何使用Spring Boot监听器来优化应用程序性能?
    ......
  • Vite+Vue3 加载速度优化
    可以考虑从以下几个方面优化。整体思路:1.减小打包体积。2.异步加载。静态资源拆分打包在常规打包方法下,所有的第三方依赖将会都打包在一个vendor.js文件里,首次打开页面时,服务器会先加载这个大文件,导致白屏时间过长。而我们打包时,事先将依赖拆分成很多小文件各自进行打包,便可......
  • RX66T优化用于电机控制R5F566TFFGFP、R5F566TKGGFP、R5F566TKCGFP搭载第三代RXv3 CPU
    1、RX66T 框图2、描述RX66T32位MCU是基于第三代RXv3CPU内核的旗舰32位RXMCU系列中的首款产品。这些MCU优化用于电机控制,可满足实时性能和增强稳定性要求。这些特性帮助实现下一代智能工厂设备和智能家电中的逆变器控制。这些MCU还具有下一代设计中嵌入式AI所需的额外处理能......
  • SQL执行顺序,优化的禁止项,建议项
    SQL执行顺序,优化的禁止项建议项SQL执行顺序如下:1.FROM,(-includingJOIN)2.WHERE3.GROUPBY4.HAVING5.WINDOWfunctions6.SELECT7.DISTINCT8.UNION9.ORDERBY10.LIMITandOFFSET·语句性能应注意两个方面:1)数据流的流向;2)orderbylimit场景。从执行顺序......
  • 微信小程序分包体积优化建议
    代码包体积优化启动性能优化最直接的手段是降低代码包大小,代码包大小直接影响了下载耗时,影响用户启动小程序时的体验。开发者可以采取以下手段优化代码包体积:1.合理使用分包加载推荐所有小程序使用使用分包加载是优化小程序启动耗时效果最明显的手段。建议开发者按照功......
  • RTSP流媒体服务器EasyNVR视频云平台之视频观感体验的优化配置
    随着互联网基础设施建设的发展,4G/5G/NB-IoT等网络技术的广泛应用,视频监控需求越来越多,而传统监控行业和摄像机直播系统受到使用区域限制、实施成本高、入口门槛高等问题的困扰,无法有效利用优质云资源进行监控云平台的搭建。此时,EasyNVR产品应运而生,成为了解决以上痛点的完美方案......
  • 嵌入式系统中的低功耗定时器应用与优化实战
    嵌入式系统的开发在现代科技中发挥着至关重要的作用。它们被广泛应用于从智能家居到工业自动化的各种领域。在本文中,我们将聚焦于使用ARMCortex-M系列微控制器实现低功耗定时器的应用。我们将详细介绍在嵌入式系统中如何实现低功耗的定时器功能,并附上代码示例。嵌入式系统低功耗定......
  • 小程序性能优化指南
    小程序性能优化指南性能扫描工具开发者可通过开发者工具中的性能扫描工具提前发现代码中的可优化项,共13项:优化建议1.代码包不包含插件大小超过1.5M【建议】小程序代码包单个包大小限制为2M。因此我们建议开发者在开发时,如果遇到单包体积大于1.5M的情况,可以采取分包的方式......