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

简介:

原文地址:Maximizing WPF 3D Performance on Tier-2 Hardware

开发人员在应用程序中使用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设置为falseWPF的反走样剪切非常慢,而且ClipToBounds默认是为true的。

Viewport3D.IsHitTestVisible

如果鼠标点击时不需要考虑Viewport3D的内容,Viewport3D.IsHitTestVisible应该设置为false3D内容的点击测试是由软件实现的,在大的网格中非常慢。Viewport3DIsHitTestVisible默认是为true的。

GeometryModel3D

只有在需要不同的Materials或者Transforms时,才建立不同的模型。否则应该把多个GeometryModel3D实例用相同的MaterialsTransforms组合到一个更大的GeometryModel3DMeshGeometry3D实例之中。

MeshGeometry3D

基于每帧来改变网格的不同顶点形成的网格动画在WPF不是很高效。在修改顶点时,为了减少对性能的影响,在执行每个顶点的修改之前应该从Visual树中Detach网格。在修改完成后,重新AttachVisual树。同样,构建这样的动画时应该减小网格的大小。

3D反走样

为了尽可能增加提交速度,可通过设置Attached属性RenderOptions.EdgeModeAliased来禁用Multisampling。默认时,3D反走样在Windows XP被禁用,而在Windows Vista被启用,每个象素4Samples

Text

3D场景中的实时文本(比较在DrawingBrush或者VisualBrush中的文本就是实时的)通常非常缓慢。尝试使用文本的图像(通过RenderTargetBitmap)来代替她,除非你需要修改文本。

TileBrush

如果你必须要在3D场景中使用VisualBrush或者DrawingBrush(因为这种Brush的内容不是静态的),应该尝试缓存Brush(通过设置Attached属性RenderOptions.CachingHintCache实现)。

CacheInvalidationThresholdMinimumCacheInvalidationThresholdMaximum设置无效放缩的最大、最小阀值。她能在场景中减小Brush重新生成的次数(甚至是避免),同时保持我们需要的质量。默认时,DrawingBrushVisualBrush都没有缓存,表示每次重画都必须重新生成画刷,而且整个内容是被画到一个临时的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

通常,重用MeshGeometry3DGeometryModel3DBrushMaterials很有好处。由于她们都从Freezable继承,都可以拥有多个父元素。

Brush

Brush内容不改变时,用ImageBrush来代替VisualBrushDrawingBrush2D内容可以通过RenderTargetBitmap转换为Image,然后在ImageBursh中使用。

Light

光源速度(从快到慢):

Ambient

Directional

Point

Spot

MeshGeometry3D

尽量让网格大小满足这些条件:

MeshGeometry3D.Positions: 20,001Point3D实例

MeshGeometry3D.TriangleIndices: 60,003Int32实例

Materials

Materials速度(从快到慢):

EmissiveMaterials

DiffuseMaterials

SpecularMaterials

Brush

WPF 3D没有以相同的方式来选择忽略不可见的画刷(黑色的环境Brush、光亮画刷等等)。不要在我们的场景中使用她们。

MaterialsGroup

MaterialsGroup中的每个Materials都引起另一个提交通道,因此包含多个Materials,即使是简单的Materials也会严重地增加GPU的填充指令。应该在MaterialsGroup尽可能减少Materials的数量。

 

性能影响级别:低

属性

建议

Transform3DGroup

当我们不需要动画或者数据绑定时,不要使用Transform组包含多个Transform。而是使用一个单独的MatrixTransform3D

Light

在场景中减少光源的数量。太多的光源会强制WPF回退到软件提交实现。粗略的限制是110DirectionalLights70PointLights或者40SpotLights

ModelVisual3D

应该把静态对象单独放入一个ModelVisual3D实例。ModelVisual3DGeometryModel3D更庞大,因为她缓存了变换的边界。GeometryModel3D适合于模型。而ModelVisual3D适合于场景点。我们需要使用ModelVisual3D来把GeometryModel3D实例(希望共享)放入场景之中。

Light

在场景中减少改变光源的次数。每次改变光源都强制重新生成Shader、重新编译。除非原来的配置已经存在(也就是Shader被缓存)。

MeshGeometry3D

为了减少在WPF构造大量集合的时间,比如MeshGeometry3DPositionNormalsTextureCoordinatesTrangleIndices。应该在值写入前就改变集合的大小。如果可能,直接向集合的构造函数传入一个Array或者List

作者:David Teitlebaum。感谢Chris RaubacherAnthony HodsdonJordan ParkerDaniel Lehenbauer



本文转自赖仪灵博客园博客,原文链接:http://www.cnblogs.com/YilingLai/archive/2007/02/09/645536.html

,如需转载请自行联系原作者。


目录
相关文章
|
6月前
|
缓存 C# 虚拟化
WPF列表性能提高技术
WPF数据绑定系统不仅需要绑定功能,还需要能够处理大量数据而不会降低显示速度和消耗大量内存,WPF提供了相关的控件以提高性能,所有继承自`ItemsControl`的控件都支持该技术。
|
大数据 C# 数据库
WPF DataGrid 性能加载大数据
原文:WPF DataGrid 性能加载大数据 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010265681/article/details/76651725  WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势。
2091 0
|
C# 虚拟化 UED
细数改善WPF应用程序性能的10大方法
原文:细数改善WPF应用程序性能的10大方法       WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势。
1134 0
|
算法 C# 图形学
WPF绘制深度不同颜色的3D模型填充图和线框图
原文:WPF绘制深度不同颜色的3D模型填充图和线框图 在机械测量过程中,测量的数据需要进行软件处理。通常测量一个零件之后,需要重建零件的3D模型,便于观察测量结果是否与所测工件一致。
2858 0
|
C# 图形学 传感器
WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化
原文:WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化 注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及填充和线框图。
1022 0
|
C# 索引
好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果
原文:好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/46567895 效果呢就是这么个效果,但是大家要发挥想象力,比如做成一个可以旋转的按钮等等。
889 0
|
C# C++
WPF性能调试系列 – 应用程序时间线
原文:WPF性能调试系列 – 应用程序时间线 WPF性能调试系列文章:     WPF页面渲染优化:Application Timeline     WPF页面业务加载优化:Ants Performance Profiler       WPF内存优化:Ants Memory Profiler   应用程序时间线(Application Timeline)     应用程序时间线工具是VS2015新添加的功能,通过对WPF程序的检测,可以分析应用程序消耗的时间包含用户界面框架、服务网络和磁盘请求、程序启动及页面加载。
1434 0
|
C#
WPF性能调试系列 – 内存监测
原文:WPF性能调试系列 – 内存监测 WPF性能调试系列文章:     WPF页面渲染优化:Application Timeline     WPF页面业务加载优化:Ants Performance Profiler       WPF内存优化:Ants Memory Profiler   内存监测(Ants Memory Profiler)     Ants Memory Profiler是专门针对于.net程序的内存动态分析工具,通过实时监测WPF程序中每个对象分配的内存空间大小,来提供多样式报告展示内存的使用情况。
1276 0
|
监控 C# Windows
WPF性能调试系列 – Ants Performance Profiler
原文:WPF性能调试系列 – Ants Performance Profiler WPF性能调试系列文章:     WPF页面渲染优化:Application Timeline     WPF页面业务加载优化:Ants Performance Profiler       WPF内存优化:Ants Memory Profiler   Ants Performance Profiler     Ant Performance Profiler是RedGate旗下强大的性能调优产品, 可以用于分析.NET Winform、webform以及Windows服务。
1355 0
|
C# Windows 图形学
优化WPF 3D性能
原文:优化WPF 3D性能 Maximize WPF 3D Performance .NET Framework 4.5   As you use the Windows Presentation Foundation (WPF) to build 3D contr...
1316 0