WPF TextBlock控件性能优化指南
WPF TextBlock控件性能优化指南
1. 引言
TextBlock作为WPF中最基础且使用最广泛的文本显示控件,其性能优化对整个应用程序的响应速度和资源占用有着重要影响。尽管TextBlock是一个轻量级控件,但在大型应用或需要显示大量文本的场景中,不恰当的使用方式仍可能导致性能问题。本文将详细介绍TextBlock控件的性能优化策略,帮助开发者构建更高效的WPF应用。
2. 控件选择策略
在WPF应用中,为不同场景选择合适的文本控件是性能优化的第一步。
2.1 文本控件的性能对比
2.2 选择合适的控件
根据实际需求选择合适的控件:
- 简短文本(如UI中的标签):使用TextBlock
- 最简单的文本显示:使用Label
- 富文本内容:使用FlowDocument(注意性能开销较大)
// 简单文本显示场景
TextBlock simpleTextBlock = new TextBlock();
simpleTextBlock.Text = "这是简单文本内容"; // 简短文本首选TextBlock// 需要大量富文本支持的场景
FlowDocument richTextDocument = new FlowDocument();
Paragraph para = new Paragraph();
para.Inlines.Add(new Run("这是富文本内容"));
richTextDocument.Blocks.Add(para);
// FlowDocument性能开销较大,仅在需要复杂排版时使用
2.3 在FlowDocument中避免使用TextBlock
TextBlock元素派生自UIElement,而Run元素派生自TextElement,使用成本低于UIElement派生对象。
<FlowDocument><!-- 推荐:使用Run显示文本内容 --><Paragraph><Run>使用Run元素显示文本更高效</Run></Paragraph><!-- 不推荐:在FlowDocument中使用TextBlock显示文本 --><Paragraph><TextBlock>这样使用TextBlock效率较低</TextBlock></Paragraph>
</FlowDocument>
3. 文本属性设置优化
3.1 避免使用Run来设置文本属性
在TextBlock中使用Run设置文本属性,比直接在TextBlock上设置属性的性能要求更高。
<!-- 不推荐:使用Run设置文本属性 -->
<TextBlock><Run FontWeight="Bold">粗体文本</Run>
</TextBlock><!-- 推荐:直接在TextBlock上设置属性 -->
<TextBlock FontWeight="Bold">粗体文本
</TextBlock>
性能测试表明,显示1000个TextBlock对象时:
- 使用Run设置文本属性:创建时间146ms,渲染时间540ms
- 直接在TextBlock设置文本属性:创建时间43ms,渲染时间453ms
3.2 合理使用内联元素
当真正需要在同一TextBlock中使用多种样式时,内联元素是必要的:
TextBlock mixedFormatTextBlock = new TextBlock();
// 创建粗体内联元素
Bold boldText = new Bold(new Run("粗体文本"));
// 创建斜体内联元素
Italic italicText = new Italic(new Run("斜体文本"));
// 创建带下划线的内联元素
Underline underlineText = new Underline(new Run("下划线文本"));// 添加到TextBlock中,实现混合格式
mixedFormatTextBlock.Inlines.Add(boldText);
mixedFormatTextBlock.Inlines.Add(new Run(" 普通文本 "));
mixedFormatTextBlock.Inlines.Add(italicText);
mixedFormatTextBlock.Inlines.Add(new LineBreak());
mixedFormatTextBlock.Inlines.Add(underlineText);
4. Hyperlink优化
4.1 合并超链接到同一TextBlock
将多个超链接组合在同一个TextBlock中,减少对象创建数量:
<!-- 不推荐:分散在多个TextBlock中的超链接 -->
<TextBlock><Hyperlink NavigateUri="http://www.example.com">链接一</Hyperlink>
</TextBlock>
<TextBlock Text=" | "/>
<TextBlock><Hyperlink NavigateUri="http://example.org">链接二</Hyperlink>
</TextBlock><!-- 推荐:在同一个TextBlock中组合多个超链接 -->
<TextBlock><Hyperlink NavigateUri="http://www.example.com">链接一</Hyperlink><Run Text=" | " /><Hyperlink NavigateUri="http://example.org">链接二</Hyperlink>
</TextBlock>
4.2 仅在MouseEnter事件时显示下划线
TextDecoration对象会占用实例化资源。如果广泛使用Hyperlink元素,建议仅在鼠标悬停时显示下划线:
// 创建不带下划线的超链接
Hyperlink link = new Hyperlink(new Run("性能优化链接"));
link.NavigateUri = new Uri("http://www.example.com");
link.TextDecorations = null; // 默认没有下划线// 添加鼠标事件
link.MouseEnter += (sender, e) => {// 鼠标悬停时添加下划线((Hyperlink)sender).TextDecorations = TextDecorations.Underline;
};
link.MouseLeave += (sender, e) => {// 鼠标离开时移除下划线((Hyperlink)sender).TextDecorations = null;
};TextBlock linkBlock = new TextBlock();
linkBlock.Inlines.Add(link);
性能测试表明,显示1000个Hyperlink元素时:
- 带下划线:创建时间289ms,渲染时间1130ms
- 不带下划线:创建时间299ms,渲染时间776ms
5. 数据绑定优化
5.1 避免将数据绑定到Label.Content属性
// 数据上下文示例类
public class MessageViewModel : INotifyPropertyChanged
{private string _message;public string Message{get { return _message; }set{if (_message != value){_message = value;OnPropertyChanged("Message");}}}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}// 在代码中创建绑定
private void SetupBindings()
{MessageViewModel viewModel = new MessageViewModel();viewModel.Message = "初始消息";// 不推荐:绑定到Label.ContentLabel messageLabel = new Label();Binding labelBinding = new Binding("Message");messageLabel.SetBinding(Label.ContentProperty, labelBinding);// 推荐:绑定到TextBlock.TextTextBlock messageTextBlock = new TextBlock();Binding textBlockBinding = new Binding("Message");messageTextBlock.SetBinding(TextBlock.TextProperty, textBlockBinding);// 设置数据上下文messageLabel.DataContext = viewModel;messageTextBlock.DataContext = viewModel;// 更新测试viewModel.Message = "更新的消息"; // TextBlock.Text更新更快速
}
性能对比:
- Label.Content:更新时间835ms
- TextBlock.Text:更新时间242ms
5.2 选择合适的绑定模式
根据实际需求选择性能最优的绑定模式:
// 对于静态内容,使用OneTime绑定模式(性能最佳)
TextBlock staticTextBlock = new TextBlock();
Binding staticBinding = new Binding("StaticProperty") { Mode = BindingMode.OneTime };
staticTextBlock.SetBinding(TextBlock.TextProperty, staticBinding);// 对于需要从源到目标更新的内容,使用OneWay绑定
TextBlock dynamicTextBlock = new TextBlock();
Binding oneWayBinding = new Binding("DynamicProperty") { Mode = BindingMode.OneWay };
dynamicTextBlock.SetBinding(TextBlock.TextProperty, oneWayBinding);// 仅在真正需要双向通信时使用TwoWay绑定(性能开销最大)
TextBox inputTextBox = new TextBox();
Binding twoWayBinding = new Binding("EditableProperty") { Mode = BindingMode.TwoWay };
inputTextBox.SetBinding(TextBox.TextProperty, twoWayBinding);
5.3 优化UpdateSourceTrigger设置
当使用TwoWay绑定时,合理设置UpdateSourceTrigger可减少不必要的更新:
<!-- 不推荐:每次属性变化都更新 -->
<TextBox Text="{Binding Path=UserInput, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /><!-- 推荐:仅在失去焦点时更新,减少更新频率 -->
<TextBox Text="{Binding Path=UserInput, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
6. 渲染和资源优化
6.1 冻结可冻结的资源
通过冻结不需要动态变化的资源减少系统监听开销:
// 创建文本使用的画刷
SolidColorBrush textBrush = new SolidColorBrush(Colors.Blue);
// 冻结画刷以提高性能
textBrush.Freeze();// 应用到TextBlock
TextBlock optimizedTextBlock = new TextBlock();
optimizedTextBlock.Text = "使用冻结资源的文本";
optimizedTextBlock.Foreground = textBrush; // 使用冻结的画刷// 在XAML中也可以冻结资源
// <SolidColorBrush x:Key="FrozenBrush" Color="Blue" PresentationOptions:Freeze="True" />
6.2 批量创建TextBlock的优化
当需要创建大量TextBlock时,使用批量操作提高性能:
/// <summary>
/// 优化批量创建TextBlock的方法
/// </summary>
/// <param name="container">父容器面板</param>
/// <param name="count">需要创建的TextBlock数量</param>
private void CreateOptimizedTextBlocks(Panel container, int count)
{// 重要:开始批量操作前禁用布局更新container.BeginInit();for (int i = 0; i < count; i++){TextBlock textBlock = new TextBlock();textBlock.Text = $"文本块 {i}";// 对于不变的属性,使用冻结的资源if (i % 2 == 0){// 共享相同的冻结画刷实例,而不是每次创建新的SolidColorBrush brush = new SolidColorBrush(Colors.DarkBlue);brush.Freeze();textBlock.Foreground = brush;}container.Children.Add(textBlock);}// 完成后启用布局更新,此时才会真正计算布局container.EndInit();
}
7. 长文本处理优化
7.1 合理使用TextWrapping和TextTrimming
对于长文本,正确设置TextWrapping和TextTrimming属性可以提高渲染效率:
// 创建长文本显示控件
TextBlock longTextBlock = new TextBlock();
longTextBlock.Text = "这是一段很长的文本内容,在实际应用中可能会更长...";// 设置固定宽度(触发换行或截断)
longTextBlock.Width = 200;// 方式1:使用TextTrimming截断文本并显示省略号(性能较好)
longTextBlock.TextTrimming = TextTrimming.CharacterEllipsis;
longTextBlock.TextWrapping = TextWrapping.NoWrap; // 不换行// 方式2:使用TextWrapping自动换行(性能稍差但显示完整)
// longTextBlock.TextWrapping = TextWrapping.Wrap;
// longTextBlock.TextTrimming = TextTrimming.None;
7.2 避免不必要的自动断字
自动断字功能会引发COM互操作,可能影响应用性能,仅在必要时启用:
TextBlock hyphenationTextBlock = new TextBlock();
hyphenationTextBlock.Text = "这是需要断字处理的长段落文本内容示例...";
hyphenationTextBlock.TextWrapping = TextWrapping.Wrap;
hyphenationTextBlock.Width = 150;// 不推荐:除非确实需要,否则不要启用自动断字
// hyphenationTextBlock.IsHyphenationEnabled = true; // 会导致性能下降// 如果必须使用断字功能,请与其他性能优化策略结合使用
8. 高级优化策略
8.1 使用UIElement的缓存功能
对于复杂但静态的TextBlock,可以使用缓存提高性能:
TextBlock complexTextBlock = new TextBlock();
// 设置复杂的内联格式化内容
Span span = new Span();
span.Inlines.Add(new Bold(new Run("粗体内容")));
span.Inlines.Add(new Run(" 正常内容 "));
span.Inlines.Add(new Italic(new Run("斜体内容")));complexTextBlock.Inlines.Add(span);// 对于不经常变化的复杂TextBlock,启用缓存提高性能
// 注意:仅对静态内容有效,如果内容频繁变化反而会降低性能
complexTextBlock.CacheMode = new BitmapCache();
8.2 在滚动区域中优化TextBlock
在滚动视图中显示大量TextBlock时,使用虚拟化容器提升性能:
// 在XAML中设置ItemsControl的面板为虚拟化面板
// <ItemsControl ItemsSource="{Binding TextItems}">
// <ItemsControl.ItemsPanel>
// <ItemsPanelTemplate>
// <VirtualizingStackPanel VirtualizationMode="Recycling"/>
// </ItemsPanelTemplate>
// </ItemsControl.ItemsPanel>
// <ItemsControl.ItemTemplate>
// <DataTemplate>
// <TextBlock Text="{Binding}" />
// </DataTemplate>
// </ItemsControl.ItemTemplate>
// </ItemsControl>// 代码中实现对应的集合
ObservableCollection<string> TextItems = new ObservableCollection<string>();private void LoadLargeTextCollection()
{// 添加1000个文本项for (int i = 0; i < 1000; i++){TextItems.Add($"文本项 #{i} - 性能优化示例");}
}
8.3 使用FormattedText对象的性能考虑
当需要高度自定义文本格式且TextBlock不足以满足需求时,可以使用FormattedText:
/// <summary>
/// 使用FormattedText绘制自定义格式文本
/// </summary>
protected override void OnRender(DrawingContext drawingContext)
{base.OnRender(drawingContext);// 创建FormattedText对象FormattedText formattedText = new FormattedText("FormattedText性能优化示例",CultureInfo.GetCultureInfo("zh-cn"),FlowDirection.LeftToRight,new Typeface("微软雅黑"),16,Brushes.Black,VisualTreeHelper.GetDpi(this).PixelsPerDip);// 设置最大宽度限制(减少不必要的格式化计算)formattedText.MaxTextWidth = ActualWidth;// 应用不同的格式formattedText.SetFontWeight(FontWeights.Bold, 0, 13);formattedText.SetForegroundBrush(Brushes.Blue, 0, 13);formattedText.SetFontStyle(FontStyles.Italic, 14, 4);// 高效渲染:一次绘制整个文本对象drawingContext.DrawText(formattedText, new Point(5, 5));
}
9. 实际应用场景中的优化案例
9.1 数据显示列表优化
/// <summary>
/// 优化大数据列表中TextBlock的性能
/// </summary>
public void OptimizeDataListPerformance()
{// 1. 使用虚拟化容器listView.VirtualizingPanel.IsVirtualizing = true;listView.VirtualizingPanel.VirtualizationMode = VirtualizationMode.Recycling;// 2. 禁用不必要的滚动条自动显示(减少布局重新计算)ScrollViewer.SetHorizontalScrollBarVisibility(listView, ScrollBarVisibility.Disabled);// 3. 使用延迟滚动增强用户体验ScrollViewer.SetIsDeferredScrollingEnabled(listView, true);// 4. 为模板中的TextBlock设置固定宽度和截断方式(避免动态计算)// <DataTemplate>// <TextBlock Text="{Binding Name}" Width="150" TextTrimming="CharacterEllipsis" />// </DataTemplate>// 5. 数据绑定使用最优模式// Text="{Binding Name, Mode=OneWay}"
}
9.2 动态更新文本内容的优化
/// <summary>
/// 优化需要频繁更新的文本显示
/// </summary>
private TextBlock statusTextBlock;
private StringBuilder textBuilder = new StringBuilder();
private DispatcherTimer updateTimer;public void SetupDynamicTextUpdates()
{statusTextBlock = new TextBlock();// 1. 使用StringBuilder预构建文本,避免字符串连接操作textBuilder.Clear();textBuilder.Append("状态: ");textBuilder.Append("正常");statusTextBlock.Text = textBuilder.ToString();// 2. 批量更新,避免频繁UI刷新updateTimer = new DispatcherTimer();updateTimer.Interval = TimeSpan.FromMilliseconds(500); // 设置合理的更新间隔updateTimer.Tick += (s, e) => {// 在单个UI更新周期内完成所有文本更改textBuilder.Clear();textBuilder.Append("状态: ");textBuilder.Append(DateTime.Now.ToString("HH:mm:ss"));statusTextBlock.Text = textBuilder.ToString();};updateTimer.Start();// 3. 长时间不可见时暂停更新statusTextBlock.IsVisibleChanged += (s, e) => {if ((bool)e.NewValue)updateTimer.Start();elseupdateTimer.Stop();};
}
10. 性能测试与验证
为了验证优化效果,可以使用以下方法进行性能测试:
/// <summary>
/// 测试不同TextBlock实现方式的性能差异
/// </summary>
private void CompareTextBlockPerformance()
{const int COUNT = 1000; // 测试数量StackPanel container = new StackPanel();// 记录开始时间var stopwatch = Stopwatch.StartNew();// 测试方式1:直接在TextBlock上设置属性container.Children.Clear();stopwatch.Restart();for (int i = 0; i < COUNT; i++){TextBlock tb = new TextBlock();tb.Text = "测试文本";tb.FontWeight = FontWeights.Bold;container.Children.Add(tb);}stopwatch.Stop();Console.WriteLine($"直接设置属性方式: {stopwatch.ElapsedMilliseconds}ms");// 测试方式2:使用Run设置属性container.Children.Clear();stopwatch.Restart();for (int i = 0; i < COUNT; i++){TextBlock tb = new TextBlock();Run run = new Run("测试文本");run.FontWeight = FontWeights.Bold;tb.Inlines.Add(run);container.Children.Add(tb);}stopwatch.Stop();Console.WriteLine($"使用Run设置属性方式: {stopwatch.ElapsedMilliseconds}ms");// 测试方式3:批量优化创建container.Children.Clear();stopwatch.Restart();container.BeginInit();for (int i = 0; i < COUNT; i++){TextBlock tb = new TextBlock();tb.Text = "测试文本";tb.FontWeight = FontWeights.Bold;container.Children.Add(tb);}container.EndInit();stopwatch.Stop();Console.WriteLine($"批量优化创建方式: {stopwatch.ElapsedMilliseconds}ms");
}
11. 总结与最佳实践
通过对TextBlock控件的性能优化,我们可以显著改善WPF应用的响应速度和资源使用效率。主要优化策略包括:
- 控件选择优化:为不同场景选择合适的文本控件
- 属性设置优化:直接在TextBlock上设置属性,避免不必要的Run元素
- 超链接优化:合并超链接,按需显示下划线
- 数据绑定优化:避免绑定到Label.Content,选择合适的绑定模式
- 渲染优化:冻结资源,批量创建,使用缓存
- 长文本处理:合理使用TextWrapping和TextTrimming,避免不必要的自动断字
- 滚动区域优化:使用虚拟化面板,启用延迟滚动
- 动态更新优化:使用StringBuilder,批量更新,合理安排更新频率
最后,记住性能优化是一个平衡的过程,需要根据具体应用场景和用户需求进行调整。定期测试和监控应用性能,找出瓶颈所在,有针对性地应用优化策略,才能达到最佳效果。
12. 学习资源
- 微软官方文档 - 优化性能:文本
- WPF性能优化指南
- WPF TextBlock类参考
- 高性能WPF应用开发
- WPF程序性能优化总结
相关文章:
WPF TextBlock控件性能优化指南
WPF TextBlock控件性能优化指南 1. 引言 TextBlock作为WPF中最基础且使用最广泛的文本显示控件,其性能优化对整个应用程序的响应速度和资源占用有着重要影响。尽管TextBlock是一个轻量级控件,但在大型应用或需要显示大量文本的场景中,不恰当…...
DotNet 入门:(一) 环境安装
一、前言 本想用 Go 语言实现一个通过小爱同学操作电脑的,比如我对着手机说打开音乐,或调小音乐,电脑能做相应的处理。奈何我一时间没看懂,就想着用.Net 来试一下,于是就有了下面这篇文章。 二、安装.Net 环境 1. 下…...
初识Redis · 分布式锁
目录 前言: 分布式锁 setnx lua脚本和看门狗 redlock算法 Redlock 的加锁流程(5 步) 前言: 到了分布式锁这一章之后,我们首先能联想到的问题就是线程安全的问题,线程安全指的是多个线程在并发执行的…...
使用 OpenCV 实现图像中心旋转
在图像处理中,围绕中心点旋转图像是一个常见的需求。无论是为了数据增强、视觉效果,还是图像对齐,旋转图像都是一项基础且重要的操作。本文将详细介绍如何使用 OpenCV 实现围绕图像中心旋转的功能,并深入探讨其背后的数学原理。 一…...
云钥科技红外短波工业相机
云钥科技的红外短波相机是一款基于短波红外(SWIR,波长范围约1-3微米)技术的成像设备,专为高精度检测、全天候成像及特殊场景应用设计。以下从核心技术、性能参数、应用场景及产品优势等方面进行详细介绍: 一、核心…...
npm如何安装pnpm
在 npm 中安装 pnpm 非常简单,你可以通过以下步骤完成: 1. 使用 npm 全局安装 pnpm 打开终端(命令行工具),运行以下命令: npm install -g pnpm2. 验证安装 安装完成后,可以检查 pnpm 的版本以确保安装成功: pnpm --version如果正确显示版本号(如 8.x.x),说明安…...
GTC Taipei 2025 医疗域前瞻:从AI代理到主权生态,解码医疗健康与生命科学的未来图景
引言 2025年,全球医疗健康领域正经历一场由人工智能、机器人技术与分布式计算驱动的范式转移。随着NVIDIA及其生态伙伴在GTC Taipei 2025大会上的深度布局,医疗行业的核心趋势愈发清晰:AI代理程序(Digital AI Agents)赋能临床协作、医疗大数据与精准医学加速落地、医学影…...
【AI学习】李宏毅新课《DeepSeek-R1 这类大语言模型是如何进行「深度思考」(Reasoning)的?》的部分纪要
针对推理模型,主要讲了四种方法,两种不需要训练模型,两种需要。 对于reason和inference,这两个词有不同的含义! 推理时计算不是新鲜事,AlphaGo就是如此。 这张图片说明了将训练和推理时计算综合考虑的关系&…...
npm打包内存不足- JavaScript heap out of memory
直接贴出报错信息 <--- Last few GCs --->[30904:0000010F60FE58E0] 22090 ms: Scavenge 2037.4 (2069.4) -> 2036.4 (2074.2) MB, 2.5 / 0.0 ms (average mu 0.228, current mu 0.216) allocation failure [30904:0000010F60FE58E0] 22101 ms: Scavenge 2…...
【最新 MCP 战神手册 08】工具使用详解:实现 AI 行动
文章目录 1. 开始啦!2. 第一部分:设计高效且安全的工具3. 第二部分:定义工具蓝图——参数、输出与约束条件4. 第三部分:弥合差距:LLM 兼容性(函数调用)5. 第四部分:实施与测试的最佳实践1. 开始啦! 在前几章中,我们将工具介绍为 AI 模型在 MCP 客户端引导下向 MCP 服…...
开发iOS App时,我常用的一款性能监控小工具分享
开发iOS App时,我常用的一款性能监控小工具分享 最近在做一个iOS应用的性能优化,频繁遇到内存泄露、界面卡顿和网络请求超时的问题。平时用Xcode Instruments虽然专业,但流程繁琐,临时排查问题不够灵活。 于是开始找有没有轻量一…...
如何防止 ES 被 Linux OOM Killer 杀掉
当 Linux 系统内存不足时,内核会找出一个进程 kill 掉它释放内存,旨在保障整个系统不至于崩溃。如果 ES 按照最佳实践去实施部署,会保留一半的内存,不至于发生此类事情。但事情总有例外,有的朋友可能 ES 和其他的程序部…...
Windows权限与icacls命令详解
在Windows操作系统中,权限管理是确保系统安全和资源访问控制的核心机制。特别是在使用NTFS(New Technology File System)文件系统的环境中,访问控制列表(ACL)用于定义哪些用户或组可以对文件、文件夹或其他…...
5.4.2 MVVM例2-用户控件的使用(水在水管中流动的实例)
本文以一个例子介绍用户控件的使用(UserControl),下图所示: 一、主要技术点 1.MainViewModel使用CommunityToolkit.Mvvm 这个Nuget包 2.LinearGradientBrush使用,下面代码可以产生如下的效果 <LinearGradientBrush x:Key="HorizontalBackground" …...
PHP代码-服务器下载文件页面编写
内部环境的服务资源下载页面有访问需求,给开发和产品人员编写一个简洁的下载页面提供资源下载。直接用nginxphp的形式去编写了,这里提供展示index.php文件代码如下: <?php // 配置常量 define(BASE_DIR, __DIR__); // 当前脚本所在目录作…...
51单片机快速入门之 SPI通信 2025年4月29日09:26:32
SPI通信 : SPI(Serial Peripheral Interface)通信是一种同步串行数据传输协议,主要用于嵌入式系统内部设备之间的通信。它由Motorola公司在2000年提出,广泛应用于微控制器、传感器、存储设备等之间的数据传输。 SPI通信的主要特点…...
SpringMVC再复习1
一、三层架构 表现层(WEB 层) 定义 :是应用程序与客户端进行交互的最外层,主要负责接收用户的请求,并将处理结果显示给用户。 作用 :在 Spring MVC 中,表现层通常采用 MVC 设计模式来构建。 技…...
音视频之H.265/HEVC网络适配层
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...
01_微服务常见问题
文章目录 微服务常见问题一、常见问题概要一、问题详解1.1 服务拆分1.2 服务通信1.3 服务注册与发现1.4 服务治理1.5 数据一致性1.6 故障隔离与容错处理1.7 数据库设计1.8 性能测试与调优 微服务常见问题 一、常见问题概要 服务拆分:如何合理地拆分服务&#…...
Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界
Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界 引言 随着自动驾驶技术的迅速发展,仿真环境的构建变得愈发重要。传统的测试方法依赖物理车辆和道路进行验证,但这种方式不仅成本高昂,还存在一定的风险。为了加速自动驾驶技术的研发,仿真环境成为了一个必不可…...
【统计方法】交叉验证:Resampling, nested 交叉验证等策略 【含R语言】
Resampling (重采样方法) 重采样方法是从训练数据中反复抽取样本,并在每个(重新)样本上重新调整模型,以获得关于拟合模型的附加信息的技术。 两种主要的重采样方法 Cross-Validation (CV) 交叉验证 : 用于估计测试误…...
海外App数据隐私架构实战:构建GDPR、CCPA合规的全栈解决方案
一、隐私合规的架构范式转变 从“数据收集”到“数据最小化”传统模式:尽可能收集数据 → 导致合规风险隐私原生模式:默认不收集 → 按需申请 → 自动过期kotlin// Android权限动态申请示例(GDPR兼容) val request PermissionRe…...
Prometheus监控
1、docker - prometheusgrafana监控与集成到spring boot 服务_grafana spring boot-CSDN博客 2、【IT运维】普罗米修斯基本介绍及监控平台部署(PrometheusGrafana)-CSDN博客 3、Prometheus监控SpringBoot-CSDN博客 4、springboot集成普罗米修斯-CSDN博客…...
Vue3 Echarts 3D圆形柱状图实现教程以及封装一个可复用的组件
文章目录 前言一、实现原理二、series ——type: "pictorialBar" 简介2.1 常用属性 三、代码实战3.1 封装一个echarts通用组件 echarts.vue3.2 首先实现一个基础柱状图3.3 添加上下2个椭圆面3.4 进阶封装一个可复用的3D圆形柱状图组件 总结 前言 在前端开发的数据可视…...
洛谷P12238 [蓝桥杯 2023 国 Java A] 单词分类
[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] Copy from luogu. [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 既然都是字符串前缀的问题了,那当然首先就应该想到 Trie \text{Trie} Trie 树。 我们可…...
【3D基础】顶点法线与平面法线在光照与PBR中的区别与影响
顶点法线与平面法线在光照与PBR中的区别与影响 在3D图形学中,法线(Normal)是影响光照计算、表面细节表现和渲染质量的核心参数之一。法线用于描述一个表面或顶点的朝向,直接关系到光的反射与分布,从而影响最终像素的颜…...
jmeter-Beashell获取http请求体json
在JMeter中,使用BeanShell处理器或BeanShell Sampler来获取HTTP请求体中的JSON数据是很常见的需求。这通常用于在测试计划中处理和修改请求体,或者在响应后进行验证。以下是一些步骤和示例代码,帮助你使用BeanShell来获取HTTP请求体中的JSON数…...
为网页LOGO视频增加电影质感表现
为网页LOGO视频增加电影质感表现 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 为网页LOGO视频增加电影质感表现前几天,一个朋友开了一家烤肉店,给我发来了烤肉店的宣传视频,我…...
精益数据分析(32/126):电商指标优化与搜索策略解析
精益数据分析(32/126):电商指标优化与搜索策略解析 在创业和数据分析的探索之旅中,每一次深入学习都能为我们带来新的启发和成长。今天,我们继续秉持共同进步的理念,深入研读《精益数据分析》,…...
【空间数据分析】缓冲区分析--泰森多边形(Voronoi Diagram)-arcgis操作
泰森多边形(Voronoi Diagram):根据一组输入点生成多边形,使得每个多边形内的任意位置到其关联点的距离最近。 多边形之间无重叠,全覆盖研究区域。 边界是相邻两点连线的垂直平分线。 实验操作: 使用 Cre…...
JavaScript高级进阶(五)
操作节点属性 设置属性(先找属性再操作) setAttribute()方法添加指定的属性,并为其赋指定的值 语法: element.setAttribute(attributename/属性名,attributevalue/属性值) 例: <style> .box{ width: 200px; height: 200p…...
WPF之TextBlock控件详解
文章目录 1. TextBlock控件介绍2. TextBlock的基本用法2.1 基本语法2.2 在代码中创建TextBlock 3. TextBlock的常用属性3.1 文本内容相关属性3.2 字体相关属性3.3 外观相关属性3.4 布局相关属性 4. TextBlock文本格式化4.1 使用Run元素进行内联格式化4.2 其他内联元素 5. 处理长…...
串口通信协议
什么是串口通信? 串口通信是将数据在一条数据线上传输。 串口通信的特点是传输线少(相对于并行通信),长距离传输的成本低,但数据的传送控制比并行通信复杂。 常见的串行通信接口包括:USB,RS-…...
9.idea中创建springboot项目
9. idea中创建springboot项目 步骤 1:打开 IntelliJ IDEA 并创建新项目 启动 IntelliJ IDEA。在欢迎界面,点击 New Project(或通过菜单栏 File > New > Project)。 步骤 2:选择 Maven 项目类型 在左侧菜单中…...
详解大语言模型生态系统概念:lama,llama.cpp,HuggingFace 模型 ,GGUF,MLX,lm-studio,ollama这都是什么?
llama,llama.cpp,HuggingFace 模型 ,GGUF,MLX,lm-studio,ollama这些名词的概念给个详细的解释,彼此什么关系?是不是头很晕? 详解大语言模型生态系统概念 基础模型与架构…...
如何系统学习音视频
学习音视频技术涉及多个领域,包括音频处理、视频处理、编码解码、流媒体传输等。 第一阶段:基础知识准备 目标:掌握音视频学习所需的计算机科学和数学基础。 计算机基础 学习计算机网络基础(TCP/IP、UDP、HTTP、RTSP等协议&#…...
elementui里的el-tabs的内置样式修改失效?
1.问题图 红框里的是组件的内置样式,红框下的是自定义样式 2.分析 2.1scoped vue模板编译器在编译有scoped的stye标签时,会生成对应的postCSS插件,该插件会给每个scoped标记的style标签模块,生成唯一一个对应的 data-v-xxxhash…...
Webshell管理工具的流量特征
目录 一、常见Webshell工具流量特征 1. 中国菜刀(Chopper) 2. 冰蝎(Behinder) 3. 哥斯拉(Godzilla) 4. 蚁剑(AntSword) 5. C99 Shell…...
61.微服务保姆教程 (四) Gateway---SpringCloud微服务网关组件
Gateway—SpringCloud微服务网关组件 一、Spring Cloud Gateway简介 1.为什么要用Gateway? 在微服务架构中,通常一个系统会被拆分为多个微服务,微服务之间的调用可以用OpenFeign,但面对这么多微服务客户端调用会遇到哪些问题呢? 每个服务都需要鉴权、限流、跨域访问、权…...
问答:C++如何通过自定义实现移动构造函数和移动赋值运算符来实现rust的唯一所有权?
今天,我就带你深入C++的移动语义,用自定义的移动构造函数和移动赋值运算符,硬核模拟Rust的唯一所有权。不仅有干货代码,还会手把手讲明白,保证你看完就能上手。准备好了吗?咱们这就开干! 先搞懂Rust的“独家秘籍” Rust的唯一所有权,简单来说,就是一个资源只能有一个…...
MODSIM选型指南:汽车与航空航天企业如何选择仿真平台
1. 引言 在竞争激烈的汽车与航空航天领域,仿真技术已成为产品研发不可或缺的环节。通过在设计阶段验证概念并优化性能,仿真平台能有效缩短开发周期并降低物理样机制作成本。 MODSIM(建模与仿真)作为达索系统3DEXPERIENCE平台的核…...
扣子流程图批量导入飞书多维表格
文章目录 整体结构分步骤进行处理1. 程序代码处理2. 多维表格配置 整体结构 整个代码块结构如下: 首先,我们从其他流程中拿到一个数据列表,通过一个循环体,将每一个部分的内容都通过python代码整理后,使用【插件】的…...
Profinet 转 Modbus_4 网关
一、功能概述 1.1 设备简介 本产品是 Profinet 和 Modbus RTU 网关,使用数据映射方式工作。 本产品在 Profinet 侧作为 Profinet 从站,接西门子 PLC 如 1200 、 1500 、 200Smart 等;在 Modbus RTU 侧做为 RTU 主站或从站&#…...
Webug4.0通关笔记03- 第4关POST注入和第5关过滤注入
目录 第04关 POST型注入 1.源码分析 2.sqlmap注入 (1)bp保存报文 (2)sqlmap渗透 (3)获取flag 第05关 过滤型注入 1.源码分析 2.sqlmap渗透 (1)bp抓包保存报文 ࿰…...
虹科新品 | 汽车通信新突破!PCAN-XL首发上线!
汽车智能化浪潮汹涌 通信技术如何跟上? 虹科带着支持最新CAN XL标准的 PCAN-XL套件 重磅来袭! 助力行业快速开启 全新CAN XL标准的测试验证! 新品登场:不止是升级 虹科PCAN-XL套件 随着汽车智能化进程加速,传…...
GitHub Actions 自动化部署 Azure Container App 全流程指南
一、前言 本文将详细介绍如何通过 GitHub Actions 实现 Azure Container App 的自动化部署流程。当代码推送到 master 分支时,系统将自动完成镜像构建、推送至 ACR 以及应用部署的全过程。以下是完整的配置方案: 二、GitHub Actions 工作流配置 完整 YAML 文件(.github/wo…...
华为L420Qml在wayland环境下崩溃问题
开发环境 操作系统 : kylin v10sp1qt版本 : qt5.15硬件信息 : 华为L420型号 背景 这个问题是在指定机型才出现的,应用同事帮忙将问题与业务抽离出来形成了一个demo //main.cpp#include #include int main(int argc, char *argv[]){qputenv("QT_QPA_PLATFORM", &quo…...
UniApp 小程序嵌套 H5 页面显示隐藏监听实践
UniApp 小程序嵌套 H5 页面显示隐藏监听实践 一、背景介绍 在小程序嵌套 H5 页面的场景中,经常需要监听页面的显示和隐藏状态,以便于处理一些特定的业务逻辑,如暂停/继续定时器、暂停/继续视频播放等。 二、实现方案 1. 页面可见性 API …...
CentOS上搭建 Python 运行环境并使用第三方库
CentOS上搭建 Python 运行环境并使用第三方库 更新 YUM 配置为阿里云镜像安装依赖包下载 Python 源码解压源码包配置和编译安装验证安装创建虚拟环境安装python第三方库编写并执行 Python 脚本 centos7.9上安装python环境 更新 YUM 配置为阿里云镜像 # 备份原有的 yum 配置文…...
黑马Redis(四)
一、发布探店笔记 案例--实现查看发布探店笔记的接口: 映射到对应数据库 BLOG类中存在和对应数据库表不相关的属性,使用TableField注解表示该字段并不在表中,需要在后续进行手动维护 GetMapping("/{id}")public Result queryBlog…...