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 인스턴스를 소수의 더 큰 GeometryModel3D 및 MeshGeometry3D 인스턴스로 병합합니다. |
MeshGeometry3D | 프레임별로 메시의 개별 꼭짓점을 변경하는 메시 애니메이션이 WPF(Windows Presentation Foundation)에서 항상 효율적이지는 않습니다. 각 꼭짓점이 수정될 때 변경 알림의 성능 영향을 최소화하려면 꼭짓점별 수정을 수행하기 전에 시각적 트리에서 메시를 분리합니다. 메시가 수정된 후 시각적 트리에 메시를 다시 연결합니다. 또한 이 방법으로 애니메이션 효과를 줄 메시의 크기를 최소화해 보세요. |
3D 앤티앨리어싱 | 렌더링 속도를 높이려면 연결된 속성 EdgeMode를 Aliased 로 설정하여 Viewport3D에서 다중 샘플링을 사용하지 않도록 설정합니다. 기본적으로 Windows에서 3D 앤티앨리어싱은 픽셀당 4개의 샘플과 함께 사용하도록 설정됩니다. |
텍스트 | 3D 장면의 라이브 텍스트(라이브인 이유는 DrawingBrush 또는 VisualBrush에 있기 때문)는 느릴 수 있습니다. 텍스트가 변경되지 않는 한 텍스트의 이미지를 대신 (RenderTargetBitmap을 통해) 사용하세요. |
TileBrush | 브러시의 콘텐츠가 정적이지 않아 3D 장면에서 VisualBrush 또는 DrawingBrush를 사용해야 하는 경우 브러시를 캐시(CachingHint를 Cache 로 설정)하는 것이 좋습니다. 원하는 품질 수준을 유지하면서 캐시된 브러시가 너무 자주 다시 생성되지 않도록 최소 및 최대 비율 크기 조정 무효화 임계값(연결된 속성 CacheInvalidationThresholdMinimum 및 CacheInvalidationThresholdMaximum 사용)을 설정합니다. 기본적으로 DrawingBrush와 VisualBrush는 캐시되지 않습니다. 따라서 브러시로 그린 항목을 다시 렌더링해야 할 때마다 브러시의 전체 콘텐츠를 먼저 중간 표면으로 다시 렌더링해야 합니다. |
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와 같은 대규모 컬렉션의 생성 시간을 최소화하려면 값 채우기 전에 컬렉션의 크기를 미리 조정합니다. 가능하면 배열이나 목록과 같이 컬렉션의 생성자가 미리 채워진 데이터 구조를 전달합니다. |
참고 항목
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET Desktop feedback