最优化WPF 3D性能(基于“Tier-2”硬件)

WPF如何提升三维呈现性能及优化  在应用程序中使用 WPF生成三维场景,可以在视觉给用户提供了很好的展现效果,相反在此过程中对计算机系统资源及硬件设备的需求条件也是很苛刻的。下面我就重点说明下wpf处理三维图形在哪些方面需要考虑性能优化。一、图形硬件加速    wpf中的图形呈现都是通过图形卡的GPU来进行计算处理的,一般WPF 系统定义了三个呈现层:呈现层 0 无图形硬件加速。DirectX 版本级别低于 7.0;呈现层 1 阅读详情
开发人员在应用程序中使用Windows Presentation Foundation来构建大量的3D控件、包含3D场景时,常常会遇到如何优化其性能的问题。WPF 3D组的几个成员提供了一个影响应用程序性能的3D类和属性的列表。当我们使用她们来优化应用程序性能时应该遵从这些建议。
本随笔假定你深刻的理解了WPF 3D API。不熟悉这些API的用户在使用这些建议之前应该首先阅读WPF SDK文档。本随笔中提出的建议只适用于“Tier-2”的视频硬件(通常是指支持象素Shader 2.0和顶点Shader 2.0的硬件)。为了简洁,本随笔进行适当的总结,因此真正理解掌握她们并不简单。
性能影响级:高
属性
建议
Brush
Brush速度(从快到慢):
SolidColorBrush
LinearGradientBrush
ImageBrush
DrawingBrush(缓存的)
VisualBrush(缓存的)
RadialGradientBrush
DrawingBrush(未缓存的)
VisualBrush(未缓存的)
Viewport3D.ClipToBounds
在明确不需要把Viewport3D的内容剪切到Viewport3D的矩形范围内时,应该把Viewport3D.ClipToBounds设置为false。WPF的反走样剪切非常慢,而且ClipToBounds默认是为true的。
Viewport3D.IsHitTestVisible
如果鼠标点击时不需要考虑Viewport3D的内容,Viewport3D.IsHitTestVisible应该设置为false。3D内容的点击测试是由软件实现的,在大的网格中非常慢。Viewport3D的IsHitTestVisible默认是为true的。
GeometryModel3D
只有在需要不同的Materials或者Transforms时,才建立不同的模型。否则应该把多个GeometryModel3D实例用相同的Materials和Transforms组合到一个更大的GeometryModel3D和MeshGeometry3D实例之中。
MeshGeometry3D
基于每帧来改变网格的不同顶点形成的网格动画在WPF不是很高效。在修改顶点时,为了减少对性能的影响,在执行每个顶点的修改之前应该从Visual树中Detach网格。在修改完成后,重新Attach到Visual树。同样,构建这样的动画时应该减小网格的大小。
3D反走样
为了尽可能增加提交速度,可通过设置Attached属性RenderOptions.EdgeMode为Aliased来禁用Multisampling。默认时,3D反走样在Windows XP被禁用,而在Windows Vista被启用,每个象素4个Samples。
Text
3D场景中的实时文本(比较在DrawingBrush或者VisualBrush中的文本就是实时的)通常非常缓慢。尝试使用文本的图像(通过RenderTargetBitmap)来代替她,除非你需要修改文本。
TileBrush
如果你必须要在3D场景中使用VisualBrush或者DrawingBrush(因为这种Brush的内容不是静态的),应该尝试缓存Brush(通过设置Attached属性RenderOptions.CachingHint为Cache实现)。
用CacheInvalidationThresholdMinimum、CacheInvalidationThresholdMaximum设置无效放缩的最大、最小阀值。她能在场景中减小Brush重新生成的次数(甚至是避免),同时保持我们需要的质量。默认时,DrawingBrush和VisualBrush都没有缓存,表示每次重画都必须重新生成画刷,而且整个内容是被画到一个临时的Surface,最后再复制到目标Surface。
BitmapEffect
BitmapEffect强制其影响的所有内容都不能使用硬件加速来提交。如果需要最好的性能,请不要使用BitmapEffect。
 
性能影响级别:中
属性
建议
MeshGeometry3D
如果网格是通过共享顶点(而且这些顶点的位置、向量和纹理映射都相同),以邻接三角形的形式定义网格的,共享的顶点应该只定义一次,然后用索引MeshGeometry3D.TriangleIndices来定义三角形。
ImageBrush
当我们需要直接控制纹理大小时(比如在使用RenderTargetBitmap和/或者ImageBrush时),应该尽可能减小WPF纹理大小。注意低分辨率的纹理会降低显示质量。因此在质量和性能之间应该进行合理的选择。
Opacity
提交半透明的3D内容时(比如反射),应该在Brush或者Materials上使用Opacity属性(通过Brush.Opacity或者Materials.Opacity)而不是另外建立一个半透明的Viewport3D(使Viewport3D.Opacity < 1)。
Viewport3D
减少在场景中使用的Viewport3D的数量。把多个3D模型放在同一个Viewport3D之中,而不是为每个模型建立不同的Viewport3D。
Freezable
通常,重用MeshGeometry3D、GeometryModel3D、Brush和Materials很有好处。由于她们都从Freezable继承,都可以拥有多个父元素。
Brush
当Brush内容不改变时,用ImageBrush来代替VisualBrush和DrawingBrush。2D内容可以通过RenderTargetBitmap转换为Image,然后在ImageBursh中使用。
Light
光源速度(从快到慢):
Ambient
Directional
Point
Spot
MeshGeometry3D
尽量让网格大小满足这些条件:
MeshGeometry3D.Positions: 20,001个Point3D实例
MeshGeometry3D.TriangleIndices: 60,003个Int32实例
Materials
Materials速度(从快到慢):
EmissiveMaterials
DiffuseMaterials
SpecularMaterials
Brush
WPF 3D没有以相同的方式来选择忽略不可见的画刷(黑色的环境Brush、光亮画刷等等)。不要在我们的场景中使用她们。
MaterialsGroup
在MaterialsGroup中的每个Materials都引起另一个提交通道,因此包含多个Materials,即使是简单的Materials也会严重地增加GPU的填充指令。应该在MaterialsGroup尽可能减少Materials的数量。
 
性能影响级别:低
运算符
执行的运算
Transform3DGroup
当我们不需要动画或者数据绑定时,不要使用Transform组包含多个Transform。而是使用一个单独的MatrixTransform3D。
Light
在场景中减少光源的数量。太多的光源会强制WPF回退到软件提交实现。粗略的限制是110个DirectionalLights、70个PointLights或者40个SpotLights。
ModelVisual3D
应该把静态对象单独放入一个ModelVisual3D实例。ModelVisual3D比GeometryModel3D更庞大,因为她缓存了变换的边界。GeometryModel3D适合于模型。而ModelVisual3D适合于场景点。我们需要使用ModelVisual3D来把GeometryModel3D实例(希望共享)放入场景之中。
Light
在场景中减少改变光源的次数。每次改变光源都强制重新生成Shader、重新编译。除非原来的配置已经存在(也就是Shader被缓存)。
MeshGeometry3D
为了减少在WPF构造大量集合的时间,比如MeshGeometry3D的Position、Normals、TextureCoordinates和TrangleIndices。应该在值写入前就改变集合的大小。如果可能,直接向集合的构造函数传入一个Array或者List。
 
查看本文来源
WPF_性能优化 WPF(Windows Presentation Foundation)是微软推出的基于Windows的用户界面框架,运行在 .NET Framework 3.0及以上版本。WPF是基于DirectX引擎的,支持GPU硬件加速,在不支持硬件加速时也可以使用软件绘制。尽管WPF有诸多优点,有时我们还是会遇到性能问题,比如界面卡顿,内存泄漏等等。针对WPF程序的性能优化是一个宽泛的问题,本文是对我们这段时间以来所作工作的一个总结。 图形硬件 相同的程序在不同的硬件上运行,会有不同的表现。对渲染能力影响比较大的硬 阅读详情

相关推荐

WPF优化监控视频CPU占用高以及卡顿掉帧的解决方案(WriteableBitmap)

WPF优化监控视频CPU占用高以及卡顿掉帧的解决方案 最近项目需求,需要做一个视频软件要求有至少30个甚至30个以上的监控视频在同一画面显示并实时显示视频内容,客户指定了数据源,需要通过调用它们接口接收图片数据包,图片是一帧帧传过来的,软件得把这些图片集成放到界面上,做出类似视频播放的效果,面对如此频繁的数据更新,初步试用了一下继承于FrameworkElement的Image控件,进行数据绑定,...

jinfengdk1995的博客 8332

WPF 视频流渲染优化思路及经验总结

回顾我在wpf上渲染视频流的历程,可以分为三个阶段: 以下方案都是在ffmpeg中解码后,回调到WPF中进行渲染 1、使用WPF嵌套winform控件,在winform控件上使用GDI渲染RGB数据,这个方案拖动窗口会有严重的闪烁问题,无解。 2、使用WriteableBitmap,将一个Image控件的Sourece指定为WriteableBitmap,在C++中回调C#,通过Marsh...

sinat_27720649的博客 2516

通过分析 WPF 的渲染脏区优化渲染性能

本文介绍通过发现渲染脏区来提高渲染性能。 本文内容脏区 Dirty RegionWPF 性能套件脏区监视优化脏区重绘 脏区 Dirty Region 在计算机图形渲染中,可以每一帧绘制全部的画面,但这样对计算机的性能要求非常高。 脏区(Dirty Region)的引入便是为了降低渲染对计算机性能的要求。每一帧绘制的时候,仅仅绘制改变的部分,在软件中可以节省大量的渲染资源。而每一帧渲染时,改变了需...

walterlv - 吕毅 2293

WPF性能优化:提升界面流畅度的实用方法

WPF(Windows Presentation Foundation)允许创建丰富的用户界面,但也可能面临性能瓶颈,尤其是当应用程序变得复杂时。性能优化的目标是提高应用程序的流畅度,减少用户界面的延迟和卡顿现象。

ioioppk的博客 6612

Material Studio中分子动力学模拟得到密度density和溶解度参数

使用sketh工具画出全原子分子,以异辛烷为例子。

handsome213的博客 7321

python爬取《你好, 李焕英》豆瓣评论数据

# 导入工具包 import requests from bs4 import BeautifulSoup import time import pandas as pd import numpy as np # 请求头 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'} # =

python技巧分享 3457

WPF性能优化经验总结

原文地址:https://www.cnblogs.com/chiniao/archive/2010/08/09/1795499.html WPF性能优化一、Rendering Tier 1. 根据硬件配置的不同,WPF采用不同的Rendering Tier做渲染。下列情况请特别注意,因为在这些情况下,即使是处于Rendering Tier 2的情况下也不会硬件加速。(不全,其余请查阅SDK) WPF性能优化二、布局和设计 1.尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPan

IT界的小菜比 1978

米哈游 AI产品经理面试题精选:10道高频考题+答案解析(附PDF)

米哈游是全球知名游戏开发商,以《原神》《崩坏》系列著称,专注二次元文化与AI技术创新。本文整理了10道AI产品经理面试题,涵盖Transformer架构、智能NPC设计、机器学习应用、AIGC产品规划等核心领域。题目既考察技术理解(如RAG原理、多模态模型),又关注产品落地(游戏平衡性优化、伦理安全),同时强调跨团队协作能力。参考答案均结合米哈游业务场景,体现技术驱动与玩家体验并重的产品思维,展现AI在游戏行业的创新应用前景。

ZHHHHH15的博客 682

WPF的DataGrid渲染性能优化

提高Grid性能的几种方法。

诗三百的博客 503

关于SVPWM七段式五段式调制后的相电压和线电压波形——大疆DJI技术笔试

1.SVPWM七段式/五段式调制的相电压和线电压波形 脉宽调制(PWM)在并网变流技术中得到了广泛的应用。与正弦脉宽调制(SPWM)的控制方法相比,SVPWM方法具有直流侧电压利用率高,电压谐波小,易于数字化实现等显著的优点,从而使SVPWM在实际的应用中越来越普遍。TMS320F28335是32位浮点的DSP控制器,具有150MHz的高速处理能力,18路PWM输出,与前几代数字信号控制器相比,性能平均提高了50%。其中具体的SVPWM理论实现的原理,请参考我的博客永磁同步电机的矢量控制策略(七)一一一SV

昔时扬尘处 2万+

烽火HG680-LC刷机后体验:当贝纯净桌面+讯飞语音,老盒子秒变智能电视的折腾记录

本文详细记录了烽火HG680-LC机顶盒刷机后的使用体验,通过安装当贝纯净桌面和讯飞语音助手,老盒子焕发新生,实现无广告、快速响应的智能电视功能。文章对比了刷机前后的性能差异,分享了影音播放、语音控制等实用功能,并提供了ADB调试和问题解决的实用技巧,帮助用户将闲置的运营商盒子变身为高性能的智能影音中心。

weixin_30292843的博客 473
上一篇: WPF结构、图形支持与DirectX学习
下一篇: WPF中的逻辑树与可视树
wmjcom
博客等级 码龄24年 71粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值