Wpf 简单网格上的Viewport3D性能
我创建了一个全屏WPFWpf 简单网格上的Viewport3D性能,wpf,xaml,viewport3d,Wpf,Xaml,Viewport3d,我创建了一个全屏WPF画布,表示一条时间线。只有时间线的可见部分是组成的,因此(实际上)没有UI元素位于可见范围之外 我正在尝试使用Viewport3D将透视图添加到此时间线。目前的结果如下: 可以通过拖动左右滚动时间线。2D版本的性能非常好。但是,一旦使用Viewport2DVisual3D将画布放置在Viewport3D中,性能就会急剧下降 这不像我在渲染复杂网格,性能下降是从哪里来的,我可以防止吗? 为了让您了解3D透视图是如何实现的,我将在这里添加XAML代码,不幸的是,它本身无法工
画布
,表示一条时间线。只有时间线的可见部分是组成的,因此(实际上)没有UI元素位于可见范围之外
我正在尝试使用Viewport3D
将透视图添加到此时间线。目前的结果如下:
可以通过拖动左右滚动时间线。2D版本的性能非常好。但是,一旦使用Viewport2DVisual3D
将画布放置在Viewport3D
中,性能就会急剧下降
这不像我在渲染复杂网格,性能下降是从哪里来的,我可以防止吗?
为了让您了解3D透视图是如何实现的,我将在这里添加XAML代码,不幸的是,它本身无法工作
<Grid Background="{StaticResource BackgroundBrush}">
<Viewport3D ClipToBounds="False">
<Viewport3D.Camera>
<PerspectiveCamera
Position="0 0 5"
LookDirection="0.4 0 -1"
UpDirection="0 1 0" />
</Viewport3D.Camera>
<ContainerUIElement3D>
<ModelUIElement3D>
<AmbientLight Color="White" />
</ModelUIElement3D>
</ContainerUIElement3D>
<Viewport2DVisual3D>
<Viewport2DVisual3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 2,3,0"
TextureCoordinates="0 0, 0 1, 1 1, 1 0">
<MeshGeometry3D.Positions>
<MultiBinding Converter="{StaticResource AspectRatioToPositions}">
<Binding ElementName="TimeLineContainer" Path="Width" />
<Binding ElementName="TimeLineContainer" Path="Height" />
</MultiBinding>
</MeshGeometry3D.Positions>
</MeshGeometry3D>
</Viewport2DVisual3D.Geometry>
<Viewport2DVisual3D.Material>
<DiffuseMaterial
Viewport2DVisual3D.IsVisualHostMaterial="True"
Brush="White" />
</Viewport2DVisual3D.Material>
<Grid
x:Name="TimeLineContainer"
Width="1650" Height="600"
ClipToBounds="True"
Background="{StaticResource TimeLineBrush}"
Behaviors:MouseBehavior.LeftClickDragCommand="ActivityOverview:ActivityOverviewWindow.MouseDragged"
MouseWheel="OnMouseWheel"
MouseMove="OnMouseMoved">
<ActivityOverview:TimeLineControl x:Name="TimeLine" Focusable="True">
<ActivityOverview:TimeLineControl.CommandBindings>
<CommandBinding
Command="ActivityOverview:ActivityOverviewWindow.MouseDragged"
Executed="MoveTimeLine" />
</ActivityOverview:TimeLineControl.CommandBindings>
</ActivityOverview:TimeLineControl>
</Grid>
</Viewport2DVisual3D>
</Viewport3D>
</Grid>
使用
视口2dVisual3D
时,当您试图显示渲染耗时的内容时,性能可能会变慢。我的例子似乎就是这样
因此,您可以设置视口2dvisual3d
的
<Viewport2DVisual3D>
<Viewport2DVisual3D.CacheMode>
<BitmapCache />
</Viewport2DVisual3D.CacheMode>
...
</Viewport2DVisual3D>
...
从Windows Vista开始,默认情况下启用抗锯齿。禁用此选项也有助于提高性能。奇怪的是,这样一个简单的网格(两个三角形)会产生很大的影响,但在我的电脑上,确实如此
<Viewport3D ClipToBounds="False" RenderOptions.EdgeMode="Aliased">
结合这两种设置,我得到了很大的改进。大家好,你们可以使用
。请检查我下面的代码
<Grid Background="{StaticResource BackgroundBrush}">
<Viewport3D ClipToBounds="False">
<Viewport3D.Camera>
<OrthographicCamera
Position="0 0 5"
LookDirection="0.4 0 -1"
UpDirection="0 1 0" />
</Viewport3D.Camera>
<ContainerUIElement3D>
<ModelUIElement3D>
<AmbientLight Color="White" />
</ModelUIElement3D>
</ContainerUIElement3D>
<Viewport2DVisual3D>
<Viewport2DVisual3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 2,3,0"
TextureCoordinates="0 0, 0 1, 1 1, 1 0">
<MeshGeometry3D.Positions>
<MultiBinding Converter="{StaticResource AspectRatioToPositions}">
<Binding ElementName="TimeLineContainer" Path="Width" />
<Binding ElementName="TimeLineContainer" Path="Height" />
</MultiBinding>
</MeshGeometry3D.Positions>
</MeshGeometry3D>
</Viewport2DVisual3D.Geometry>
<Viewport2DVisual3D.Material>
<DiffuseMaterial
Viewport2DVisual3D.IsVisualHostMaterial="True"
Brush="White" />
</Viewport2DVisual3D.Material>
<Grid
x:Name="TimeLineContainer"
Width="1650" Height="600"
ClipToBounds="True"
Background="{StaticResource TimeLineBrush}"
Behaviors:MouseBehavior.LeftClickDragCommand="ActivityOverview:ActivityOverviewWindow.MouseDragged"
MouseWheel="OnMouseWheel"
MouseMove="OnMouseMoved">
<ActivityOverview:TimeLineControl x:Name="TimeLine" Focusable="True">
<ActivityOverview:TimeLineControl.CommandBindings>
<CommandBinding
Command="ActivityOverview:ActivityOverviewWindow.MouseDragged"
Executed="MoveTimeLine" />
</ActivityOverview:TimeLineControl.CommandBindings>
</ActivityOverview:TimeLineControl>
</Grid>
</Viewport2DVisual3D>
</Viewport3D>
如果图形卡上没有硬件加速,可能有各种各样的原因。@ChrisF:我有硬件加速,网格只有两个三角形。你能给出重复这个问题的最小代码吗。另外,当我在做3D的时候(很多年前现在),如果你使用渐变填充,一些卡片上会出现问题——我注意到你是这样的。试着把它去掉。如果没有其他东西的话,它将消除这种可能性。@ChrisF:删除渐变没有任何区别。他们在2D版本中也能流利地工作。我正在考虑在3D中可能更昂贵的命中测试。为什么我需要/想要使用不同的相机?