WPF绘图性能与大量元素

Wil*_*den 5 c# wpf performance drawing baduk

我试图创建一个WPF自定义控件以显示该游戏树一去的游戏(见这里的是什么样子).我或多或少地让它在设置节点时工作,但我发现的一个问题是,当节点数量大于约时,它开始变得非常慢(在滚动查看器中) 30.由于go的平均游戏包括大约200次移动(更不用说玩家可能分叉的其他分支),这在任何逼真的游戏中都将是一个相当大的问题.

目前,我正在为游戏节点使用单独的用户控件(每个都是一个带有阴影位图效果的椭圆和一些文本注释)和树中弧线的简单线条,所有这些都绝对定位在画布中.

布局算法不是一个问题,因为这只需要在创建新分支时执行(否则可以直接在其父级下添加节点,因此不需要重新定位其他节点).主要的问题是对画布及其元素的任何操作都非常缓慢,大概只是因为它有多少个孩子.随着树的宽度和复杂性的增加,它显然会变慢,因为有更多的弧和节点.

我的问题:以这样的方式绘制像这样的大型/复杂结构的正确方法是什么,它不会随着它的增长而变得太慢?

编辑:这与我的其他问题有关.

编辑:这是我用于节点的用户控件的标记:

<UserControl x:Class="Go.UI.GameNodeMarker"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Go.UI"
             xmlns:wpftools="clr-namespace:WpfTools.Extensions;assembly=WpfTools"
             x:Name="_This">
    <UserControl.Resources>
        <!-- Some brushes, resources, etc. are omitted -->
        <Style x:Key="StoneStyle" TargetType="{x:Type Ellipse}">
            <Setter Property="StrokeThickness" Value="0"/>
            <Setter Property="BitmapEffect" Value="{StaticResource StoneEffect}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=_This, Path=StoneColour}"  Value="Black">
                    <Setter Property="Fill" Value="{StaticResource BlackStoneBrush}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=_This, Path=StoneColour}" Value="White">
                    <Setter Property="Fill" Value="{StaticResource WhiteStoneBrush}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=_This, Path=IsEmpty}" Value="True">
                    <Setter Property="Fill" Value="{StaticResource EmptyBrush}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </UserControl.Resources>
    <Grid>
        <Ellipse Style="{StaticResource StoneStyle}"/>
        <TextBlock Text="{Binding ElementName=_This, Path=Text}"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   FontWeight="Medium"/>
    </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

这些是动态添加到画布以绘制树.

Pau*_*sik 9

渲染控件实际上非常昂贵.如果您在客户区域中进行自定义绘图(自己绘制项目而不是放置控件),您将看到性能显着提高.

在做这类工作时,这一直是我的经验.如果您需要十几个控件,请选择所有者.

顺便说一句,不要让自定义绘图吓倒你.它并不比动态放置控件复杂得多.

链接到自定义WPF绘图示例