首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单网格上的Viewport3D性能

简单网格上的Viewport3D性能
EN

Stack Overflow用户
提问于 2012-03-02 10:50:41
回答 2查看 2.1K关注 0票数 3

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

我试图使用Viewport3D向这个时间线添加透视图。目前的结果如下:

可以通过拖动左右滚动时间线。2D版本的性能非常好。但是,一旦使用Viewport3D将画布放置在Viewport2DVisual3D中,性能就会急剧下降。

我不是在渲染一个复杂的网格,性能下降是从哪里来的,我能阻止它吗?

为了让您了解3D透视图是如何实现的,我将在这里添加XAML代码,不幸的是,它不能单独工作。

代码语言:javascript
运行
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-02 15:26:17

在使用Viewport2DVisual3D时,当您试图显示耗时的呈现内容时,性能可能会很慢。我的例子似乎就是这样。

因此,您可以设置CacheMode of Viewport2DVisual3D

代码语言:javascript
运行
复制
<Viewport2DVisual3D>
    <Viewport2DVisual3D.CacheMode>
        <BitmapCache />
    </Viewport2DVisual3D.CacheMode>        
    ...
</Viewport2DVisual3D>

从Windows开始,默认启用反混叠.禁用它也有助于提高性能。这是奇怪的,这将有一个很大的影响与这样一个简单的网格(两个三角形),但在我的电脑,它真的!

代码语言:javascript
运行
复制
<Viewport3D ClipToBounds="False" RenderOptions.EdgeMode="Aliased">

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

票数 2
EN

Stack Overflow用户

发布于 2014-05-17 05:20:13

嗨,伙计们,你们可以用<OrthographicCamera Position="0 0 5" LookDirection="0.4 0 -1" UpDirection="0 1 0" />。请检查下面的代码

代码语言:javascript
运行
复制
<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>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9532041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档