WPF 3D 성능 최대화

WPF(Windows Presentation Foundation)를 사용하여 3D 컨트롤을 빌드하고 애플리케이션에 3D 장면을 포함할 때 성능 최적화를 고려하는 것이 중요합니다. 이 항목에서는 애플리케이션 성능에 영향을 주는 3D 클래스 및 속성 목록과 애플리케이션을 사용할 때 성능을 최적화하기 위한 권장 사항을 제공합니다.

이 항목은 독자가 WPF(Windows Presentation Foundation) 3D 기능을 깊이 이해하고 있다고 가정합니다. 이 문서의 제안은 픽셀 셰이더 버전 2.0 및 꼭짓점 셰이더 버전 2.0을 지원하는 하드웨어로 정의되는 "렌더링 계층 2"에 적용됩니다. 자세한 내용은 그레픽 렌더링 계층을 참조하세요.

성능 영향: 높음

속성 권장
Brush 브러시 속도(가장 빠른 속도부터 가장 느린 속도순):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush(캐시됨)

VisualBrush(캐시됨)

RadialGradientBrush

DrawingBrush(캐시되지 않음)

VisualBrush(캐시되지 않음)
ClipToBoundsProperty WPF(Windows Presentation Foundation)가 Viewport3D의 콘텐츠를 Viewport3D의 사각형에 클립할 필요가 없을 때는 항상 Viewport3D.ClipToBounds를 false로 설정합니다. WPF(Windows Presentation Foundation) 앤티앨리어스 클리핑은 매우 느릴 수 있으며, Viewport3D에서 ClipToBounds이 기본적으로 사용됩니다(느림).
IsHitTestVisible 마우스 적중 테스트를 수행할 때 WPF(Windows Presentation Foundation)가 Viewport3D의 콘텐츠를 고려할 필요가 없을 때는 항상 Viewport3D.IsHitTestVisible을 false로 설정합니다. 적중 테스트 3D 콘텐츠는 소프트웨어에서 수행되며 큰 메시로 인해 느릴 수 있습니다. IsHitTestVisible은 기본적으로 Viewport3D에서 사용됩니다(느림).
GeometryModel3D 다른 모델은 다른 재질이나 변형이 필요한 경우에만 만드세요. 그렇지 않을 경우 재질과 변형이 동일한 여러 GeometryModel3D 인스턴스를 소수의 더 큰 GeometryModel3DMeshGeometry3D 인스턴스로 병합합니다.
MeshGeometry3D 프레임별로 메시의 개별 꼭짓점을 변경하는 메시 애니메이션이 WPF(Windows Presentation Foundation)에서 항상 효율적이지는 않습니다. 각 꼭짓점이 수정될 때 변경 알림의 성능 영향을 최소화하려면 꼭짓점별 수정을 수행하기 전에 시각적 트리에서 메시를 분리합니다. 메시가 수정된 후 시각적 트리에 메시를 다시 연결합니다. 또한 이 방법으로 애니메이션 효과를 줄 메시의 크기를 최소화해 보세요.
3D 앤티앨리어싱 렌더링 속도를 높이려면 연결된 속성 EdgeModeAliased로 설정하여 Viewport3D에서 다중 샘플링을 사용하지 않도록 설정합니다. 기본적으로 Windows에서 3D 앤티앨리어싱은 픽셀당 4개의 샘플과 함께 사용하도록 설정됩니다.
텍스트 3D 장면의 라이브 텍스트(라이브인 이유는 DrawingBrush 또는 VisualBrush에 있기 때문)는 느릴 수 있습니다. 텍스트가 변경되지 않는 한 텍스트의 이미지를 대신 (RenderTargetBitmap을 통해) 사용하세요.
TileBrush 브러시의 콘텐츠가 정적이지 않아 3D 장면에서 VisualBrush 또는 DrawingBrush를 사용해야 하는 경우 브러시를 캐시(CachingHintCache로 설정)하는 것이 좋습니다. 원하는 품질 수준을 유지하면서 캐시된 브러시가 너무 자주 다시 생성되지 않도록 최소 및 최대 비율 크기 조정 무효화 임계값(연결된 속성 CacheInvalidationThresholdMinimumCacheInvalidationThresholdMaximum 사용)을 설정합니다. 기본적으로 DrawingBrushVisualBrush는 캐시되지 않습니다. 따라서 브러시로 그린 항목을 다시 렌더링해야 할 때마다 브러시의 전체 콘텐츠를 먼저 중간 표면으로 다시 렌더링해야 합니다.
BitmapEffect BitmapEffect는 영향을 받는 모든 콘텐츠를 하드웨어 가속 없이 렌더링하도록 강제합니다. 최상의 성능을 위해서는 BitmapEffect를 사용하지 마세요.

성능 영향: 중간

속성 권장
MeshGeometry3D 메시가 공유 꼭짓점이 있는 인접 삼각형으로 정의되고 해당 꼭짓점의 위치, 법선 및 텍스처 좌표가 같으면 각 공유 꼭짓점을 한 번만 정의한 다음 TriangleIndices를 사용하여 인덱스로 삼각형을 정의합니다.
ImageBrush 크기를 명시적으로 제어할 수 있는 경우(RenderTargetBitmap 및/또는 ImageBrush를 사용 중인 경우) 텍스처 크기를 최소화해 보세요. 해상도가 낮은 텍스처는 시각적 품질을 저하시킬 수 있으므로 품질과 성능의 적절한 균형을 찾으세요.
불투명도 반투명 3D 콘텐츠(예: 리플렉션)를 렌더링할 때는 Viewport3D.Opacity를 1보다 작은 값으로 설정하여 별도의 반투명 Viewport3D를 만드는 대신 브러시 또는 재질에서 불투명도 속성을 사용합니다(Opacity 또는 Color를 통해).
Viewport3D 장면에서 사용 중인 Viewport3D 개체 수를 최소화합니다. 모델마다 별도의 Viewport3D 인스턴스를 만들지 말고 동일한 Viewport3D에 여러 3D 모델을 배치합니다.
Freezable 일반적으로 MeshGeometry3D, GeometryModel3D, 브러시, 재질을 재사용하는 것이 좋습니다. 모두 Freezable에서 파생되기 때문에 여러 부모가 있을 수 있습니다.
Freezable 애플리케이션에서 속성이 바뀌지 않고 유지되면 Freezables에서 Freeze 메서드를 호출합니다. 동결은 작업 세트를 감소시키고 속도를 증가시킬 수 있습니다.
Brush 브러시의 콘텐츠가 변경되지 않는 경우 VisualBrush 또는 DrawingBrush 대신 ImageBrush를 사용합니다. 2D 콘텐츠는 RenderTargetBitmap을 통해 Image로 변환한 다음 ImageBrush에서 사용할 수 있습니다.
BackMaterial 실제로 GeometryModel3D의 뒷면을 볼 필요가 없다면 BackMaterial은 사용하지 마세요.
Light 광원 속도(가장 빠른 속도부터 가장 느린 속도순):

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D 다음 제한에 따라 메시 크기를 유지합니다.

Positions: 20,001 Point3D 인스턴스

TriangleIndices: 60,003 Int32 인스턴스
Material 재질 속도(가장 빠른 속도부터 가장 느린 속도순):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush WPF(Windows Presentation Foundation) 3D는 보이지 않는 브러시(검은색 앰비언트 브러시, 투명 브러시 등)를 일관된 방식으로 옵트아웃하지 않습니다. 장면에서 생략하는 것이 좋습니다.
MaterialGroup MaterialGroup의 각 Material은 또 다른 렌더링 패스를 발생시키므로 간단한 재질이더라도 많은 재질을 포함하면 GPU의 채우기 수요가 크게 증가할 수 있습니다. MaterialGroup에 있는 재질의 수를 최소화합니다.

성능 영향: 낮음

속성 권장
Transform3DGroup 애니메이션 또는 데이터 바인딩이 필요하지 않은 경우 여러 변형이 포함된 변형 그룹을 사용하는 대신 단일 MatrixTransform3D를 사용하여 변형 그룹에 따로 존재했을 모든 변형의 산출물로 설정합니다.
Light 장면의 광원 수를 최소화합니다. 장면에 광원이 너무 많으면 WPF(Windows Presentation Foundation)가 소프트웨어 렌더링으로 변경됩니다. 한도는 약 110개의 DirectionalLight 개체, 70개의 PointLight 개체 또는 40개의 SpotLight 개체입니다.
ModelVisual3D 움직이는 개체와 고정적 개체는 별도의 ModelVisual3D 인스턴스에 넣어 분리합니다. ModelVisual3D는 변형된 경계를 캐시하기 때문에 GeometryModel3D보다 "더 무겁습니다". GeometryModel3D는 모델로 최적화되어 있고, ModelVisual3D는 장면 노드로 최적화되어 있습니다. ModelVisual3D를 사용하여 GeometryModel3D의 공유 인스턴스를 장면에 배치합니다.
Light 장면의 광원 수를 변경하는 횟수를 최소화합니다. 구성이 이전에 존재하여 셰이더가 캐시되지 않은 한 광원 개수를 변경할 때마다 셰이더를 다시 생성하고 다시 컴파일해야 합니다.
밝음 검은색 광원은 표시되지 않지만 렌더링 시간에 추가되므로 생략하는 것이 좋습니다.
MeshGeometry3D WPF(Windows Presentation Foundation)에서 MeshGeometry3D의 Positions, Normals, TextureCoordinates, TriangleIndices와 같은 대규모 컬렉션의 생성 시간을 최소화하려면 값 채우기 전에 컬렉션의 크기를 미리 조정합니다. 가능하면 배열이나 목록과 같이 컬렉션의 생성자가 미리 채워진 데이터 구조를 전달합니다.

참고 항목