简化网格上的Viewport3D性能

3
我创建了一个全屏的WPF Canvas,代表时间轴。只有时间轴的可见部分被组成,所以(实际上)没有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>

可能有各种各样的原因,如果你的显卡没有硬件加速就是其中之一。 - ChrisF
@ChrisF:我有硬件加速,并且这个网格只有两个三角形。 - Steven Jeuris
你能否发布最少的代码来重现问题?另外,当我做3D(现在已经是很多年前了),如果您正在使用渐变填充,则某些卡会出现问题 - 我注意到您正在使用它。尝试删除它。即使没有其他作用,也可以将其排除为可能性。 - ChrisF
@ChrisF:去掉渐变没有任何影响。它们在2D版本中也很流畅。我认为现在在3D中可能更昂贵的是命中测试。 - Steven Jeuris
2个回答

2
使用Viewport2DVisual3D时,如果尝试显示渲染耗时的内容,则性能可能会变慢。在我的示例中似乎是这种情况。
因此,您可以设置Viewport2DVisual3DCacheMode
<Viewport2DVisual3D>
    <Viewport2DVisual3D.CacheMode>
        <BitmapCache />
    </Viewport2DVisual3D.CacheMode>        
    ...
</Viewport2DVisual3D>

从Windows Vista开始,默认情况下启用了反锯齿功能。禁用此功能也有助于提高性能。这似乎很奇怪,因为这样一个简单的网格(两个三角形)会对我的电脑产生如此大的影响!
<Viewport3D ClipToBounds="False" RenderOptions.EdgeMode="Aliased">

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

0

大家好,你们可以使用 <OrthographicCamera Position="0 0 5" LookDirection="0.4 0 -1" UpDirection="0 1 0" />。请查看下面的代码

<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>


1
我为什么需要/想要使用不同的相机? - Steven Jeuris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接