Maximize WPF 3D Performance

.NET Framework 4.5
 

As you use the Windows Presentation Foundation (WPF) to build 3D controls and include 3D scenes in your applications, it is important to consider performance optimization. This topic provides a list of 3D classes and properties that have performance implications for your application, along with recommendations for optimizing performance when you use them.

This topic assumes an advanced understanding of Windows Presentation Foundation (WPF) 3D features. The suggestions in this document apply to "rendering tier 2"—roughly defined as hardware that supports pixel shader version 2.0 and vertex shader version 2.0. For more details, see Graphics Rendering Tiers.

Performance Impact: High

 
 

Property

Recommendation

Brush

Brush speed (fastest to slowest):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (cached)

VisualBrush (cached)

RadialGradientBrush

DrawingBrush (uncached)

VisualBrush (uncached)

ClipToBoundsProperty

Set Viewport3D.ClipToBounds to false whenever you do not need to have Windows Presentation Foundation (WPF) explicitly clip the content of a Viewport3D to the Viewport3D’s rectangle. Windows Presentation Foundation (WPF) antialiased clipping can be very slow, and ClipToBounds is enabled (slow) by default on Viewport3D.

IsHitTestVisible

Set Viewport3D.IsHitTestVisible to false whenever you do not need Windows Presentation Foundation (WPF) to consider the content of a Viewport3D when performing mouse hit testing.  Hit testing 3D content is done in software and can be slow with large meshes. IsHitTestVisible is enabled (slow) by default on Viewport3D.

GeometryModel3D

Create different models only when they require different Materials or Transforms. Otherwise, try to coalesce many GeometryModel3D instances with the same Materials and Transforms into a few larger GeometryModel3D and MeshGeometry3D instances.

MeshGeometry3D

Mesh animation—changing the individual vertices of a mesh on a per-frame basis—is not always efficient in Windows Presentation Foundation (WPF).  To minimize the performance impact of change notifications when each vertex is modified, detach the mesh from the visual tree before performing per-vertex modification.  Once the mesh has been modified, reattach it to the visual tree.  Also, try to minimize the size of meshes that will be animated in this way.

3D Antialiasing

To increase rendering speed, disable multisampling on a Viewport3D by setting the attached property EdgeMode to Aliased. By default, 3D antialiasing is disabled on Microsoft Windows XP and enabled on Windows Vista with 4 samples per pixel.

Text

Live text in a 3D scene (live because it’s in a DrawingBrush or VisualBrush) can be slow. Try to use images of the text instead (via RenderTargetBitmap) unless the text will change.

TileBrush

If you must use a VisualBrush or a DrawingBrush in a 3D scene because the brush’s content is not static, try caching the brush (setting the attached property CachingHint to Cache). Set the minimum and maximum scale invalidation thresholds (with the attached properties CacheInvalidationThresholdMinimum and CacheInvalidationThresholdMaximum) so that the cached brushes won’t be regenerated too frequently, while still maintaining your desired level of quality. By default, DrawingBrush and VisualBrush are not cached, meaning that every time something painted with the brush has to be re-rendered, the entire content of the brush must first be re-rendered to an intermediate surface.

BitmapEffect

BitmapEffect forces all affected content to be rendered without hardware acceleration. For best performance, do not use BitmapEffect.

Performance Impact: Medium

 
 

Property

Recommendation

MeshGeometry3D

When a mesh is defined as abutting triangles with shared vertices and those vertices have the same position, normal, and texture coordinates, define each shared vertex only once and then define your triangles by index with TriangleIndices.

ImageBrush

Try to minimize texture sizes when you have explicit control over the size (when you’re using a RenderTargetBitmap and/or an ImageBrush). Note that lower resolution textures can decrease visual quality, so try to find the right balance between quality and performance.

Opacity

When rendering translucent 3D content (such as reflections), use the opacity properties on brushes or materials (via Opacity or Color) instead of creating a separate translucent Viewport3Dby setting Viewport3D.Opacity to a value less than 1.

Viewport3D

Minimize the number of Viewport3D objects you’re using in a scene. Put many 3D models in the same Viewport3D rather than creating separate Viewport3D instances for each model.

Freezable

Typically it’s beneficial to reuse MeshGeometry3DGeometryModel3D, Brushes, and Materials. All are multiparentable since they’re derived from Freezable.

Freezable

Call the Freeze method on Freezables when their properties will remain unchanged in your application. Freezing can decrease working set and increase speed.

Brush

Use ImageBrush instead of VisualBrush or DrawingBrush when the content of the brush will not change. 2D content can be converted to an Image via RenderTargetBitmap and then used in an ImageBrush.

BackMaterial

Don’t use BackMaterial unless you actually need to see the back faces of your GeometryModel3D.

Light

Light speed (fastest to slowest):

AmbientLight

DirectionalLight

PointLight

SpotLight

MeshGeometry3D

Try to keep mesh sizes under these limits:

Positions : 20,001 Point3D instances

TriangleIndices : 60,003 Int32 instances

Material

Material speed (fastest to slowest):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial

Brush

Windows Presentation Foundation (WPF) 3D doesn't opt out of invisible brushes (black ambient brushes, clear brushes, etc.) in a consistent way.  Consider omitting these from your scene.

MaterialGroup

Each Material in a MaterialGroup causes another rendering pass, so including many materials, even simple materials, can dramatically increase the fill demands on your GPU. Minimize the number of materials in your MaterialGroup.

Performance Impact: Low

 
 

Property

Recommendation

Transform3DGroup

When you don’t need animation or data binding, instead of using a transform group containing multiple transforms, use a single MatrixTransform3D, setting it to be the product of all the transforms that would otherwise exist independently in the transform group.

Light

Minimize the number of lights in your scene. Too many lights in a scene will force Windows Presentation Foundation (WPF) to fall back to software rendering.  The limits are roughly 110DirectionalLight objects, 70 PointLight objects, or 40 SpotLight objects.

ModelVisual3D

Separate moving objects from static objects by putting them in separate ModelVisual3D instances. ModelVisual3D is "heavier" than GeometryModel3D because it caches transformed bounds. GeometryModel3D is optimized to be a model; ModelVisual3D is optimized to be a scene node. Use ModelVisual3D to put shared instances of GeometryModel3D into the scene.

Light

Minimize the number of times you change the number of lights in the scene. Each change of light count forces a shader regeneration and recompilation unless that configuration has existed previously (and thus had its shader cached).

Light

Black lights won’t be visible, but they will add to render time; consider omitting them.

MeshGeometry3D

To minimize the construction time of large collections in Windows Presentation Foundation (WPF), such as a MeshGeometry3D’s PositionsNormalsTextureCoordinates, andTriangleIndices, pre-size the collections before value population. If possible, pass the collections’ constructors prepopulated data structures such as arrays or Lists.

优化WPF 3D性能的更多相关文章

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

    原文:最优化WPF 3D性能(基于"Tier-2"硬件) 原文地址:Maximizing WPF 3D Performance on Tier-2 Hardware 开发人员在应用 ...

  2. [Unity 3D] Unity 3D 性能优化 (一)

    听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我自己在以往项目的开发中也头疼过.最近终于有了空闲,可以仔细的研究一下该如何优化Unity 3D下的游戏性能.其实国外有 ...

  3. WPF 3D 知识点大全以及实例

    引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...

  4. WPF 3D 小小小小引擎 - ·WPF 3D变换应用

    原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用 WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开 ...

  5. 【原创】构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测CLR性能

    原文:[原创]构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)-托管资源优化-监测CLR性能 构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测C ...

  6. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)

    http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...

  7. WPF 3D变换应用

    WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开发效率高,而且也容易上手. 下面给大家演示的是使用在WPF 3 ...

  8. WPF 3D 模型旋转

    原文:WPF 3D 模型旋转 WPF 是 Microsoft 在 Framework3.0 中支持的一种技术,它能作出很绚丽的界面,同时它也支持3D的操作.在3D操作主要包括平移(Translate) ...

  9. 如何快速优化手游性能问题?从UGUI优化说起

    WeTest 导读   本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法.   在之前的文 ...

随机推荐

  1. Navicat 回复 psc 文件 Mysql

    在mysql 中回复 psc文件 的时候 只能一步步来,先在navicat中建一个空数据库,然后点击有上角的备份==>回复备份==> 找到psc文件==> 注意此时不要急于点击 开始 ...

  2. php 租房子练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. logstash之multiline插件,匹配多行日志

    在外理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如log4j.运行时日志跟访问日志最大的不同是,运行时日志是多行,也就是说,连续的多行才能表达一个意思. 在filter中,加 ...

  4. Gradle使用指南

    Gradle Plugin User Guide - Android Studio Project Sitehttp://tools.android.com/tech-docs/new-build-s ...

  5. UVA 10828 Back to Kernighan-Ritchie(高斯消元)

    高斯消元求概率 对于非起点,期望x[i] = ∑x[j] / deg[j] #include<cstdio> #include<iostream> #include<cs ...

  6. 序列化悍将Protobuf-Net,入门动手实录

    最近在研究web api 2,看了一篇文章,讲解如何提升性能的, 在序列化速度的跑分中,Protobuf一骑绝尘,序列化速度快,性能强,体积小,所以打算了解下这个利器 1:安装篇 谷歌官方没有提供.n ...

  7. bootstrap 练习

    bookList.html <!DOCTYPE html> <html lang="zh-cn"> <head> <!-- 父路径 --& ...

  8. php获取文件夹下面的文件列表和文件夹列表

    function getDir($dir) { $dirArray[] = NULL; if (false != ($handle = opendir( $dir ))) { $i=0; while ...

  9. linux 读写锁应用实例

    转自:http://blog.csdn.net/dsg333/article/details/22113489 /*使用读写锁实现四个线程读写一段程序的实例,共创建了四个新的线程,其中两个线程用来读取 ...

  10. Unity3D使用过程中常见的20个问题

    1:天空盒有接缝怎么解决?答:在贴图导入设置里设置Wrap Mode为"Clamp". 2:DDS格式怎么不显示?答:Unity不支持DDS格式,Unity会将除DDS外的其他格式 ...