wpf - 简单网格上的 Viewport3D 性能

标签 wpf xaml viewport3d

我创建了一个全屏 WPF Canvas,代表时间线。仅组成时间线的可见部分,因此(实际上)没有 UI 元素位于可见范围之外。

Time line 2D

我正在尝试使用 Viewport3D 向该时间线添加透视图。目前的结果如下所示:

Time line 3D

您可以通过拖动左右滚动时间线。 2D 版本的性能非常好。但是,一旦使用 Viewport2DVisual3D 将 Canvas 放置在 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>

最佳答案

当您尝试显示渲染耗时的内容时,使用 Viewport2DVisual3D 性能可能会很慢。在我的示例中似乎就是这种情况。

因此,您可以设置 CacheMode Viewport2DVisual3D

<Viewport2DVisual3D>
    <Viewport2DVisual3D.CacheMode>
        <BitmapCache />
    </Viewport2DVisual3D.CacheMode>        
    ...
</Viewport2DVisual3D>

从 Windows Vista 开始,抗锯齿功能默认启用。禁用它也有助于提高性能。奇怪的是,这会对如此简单的网格(两个三角形)产生巨大影响,但在我的 PC 上,它确实如此!

<Viewport3D ClipToBounds="False" RenderOptions.EdgeMode="Aliased">

结合这两个设置,我得到了很大的改进。

关于wpf - 简单网格上的 Viewport3D 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9532041/

相关文章:

c# - 使用 MVVM 模式将项目添加到集合

xaml - 如何打破XAML源代码中的长字符串?

c# - 连接到 MS Access 数据库

c# - WPF 将绑定(bind)传递到我的用户控件

xaml - Prism MVVM 绑定(bind)到用户控件依赖属性

wpf - 创建的 Viewport2DVisual3D 框架不可见

c# - WPF Viewport3D 中单色 3D 对象的有用照明

c# - SourceUpdated 和 NotifyOnSourceUpdated 未在 ListBox 中触发

c# - PropertyGroupDescription 未按预期工作

c# - 如何在WPF Viewport3d中自动调整相机LookDirection?