3

Canvasタイムラインを表すフルスクリーンのWPFを作成しました。タイムラインの表示部分のみが構成されているため、(実際には)表示範囲外にUI要素はありません。

タイムライン2D

を使用して、このタイムラインに遠近法を追加しようとしていViewport3Dます。現時点での結果は次のようになります。

タイムライン3D

ドラッグすると、タイムラインを左右にスクロールできます。2Dバージョンのパフォーマンスは素晴らしいです。ただし、キャンバスViewport3Dをusing内に配置するViewport2DVisual3Dと、パフォーマンスが大幅に低下します。

複雑なメッシュをレンダリングしているわけではありませんが、このパフォーマンスの低下はどこから来ているのでしょうか。それを防ぐことはできますか?

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

2 に答える 2

2

Viewport2DVisual3Dレンダリングに時間がかかるコンテンツを表示しようとすると、パフォーマンスが低下する可能性があります。これは私の例の場合のようでした。

このため、のを設定できCacheModeますViewport2DVisual3D

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

Windows Vista以降、アンチエイリアスはデフォルトで有効になっています。これを無効にすると、パフォーマンスの向上にも役立ちます。このような単純なメッシュ(2つの三角形)でこれが大きな影響を与えるのは奇妙ですが、私のPCではそうです!

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

これら2つの設定を組み合わせることで、大きな改善が得られました。

于 2012-03-02T15:26:17.827 に答える
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>

于 2014-05-17T05:20:13.413 に答える