代码之家  ›  专栏  ›  技术社区  ›  Will Vousden

具有大量元素的WPF绘图性能

  •  4
  • Will Vousden  · 技术社区  · 16 年前

    game of go (见 here 因为它看起来像什么)。我或多或少都在布置节点,但我发现的一个问题是,当节点数量超过30个时,它开始渲染/导航(在滚动查看器中)的速度明显变慢。因为围棋的平均游戏包含大约200个动作(更不用说玩家可能使用的其他分支),这将是一个相当大的问题,在任何现实的游戏。

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

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

    我的问题:

    编辑: 这与 my other question

    编辑:

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

    4 回复  |  直到 9 年前
        1
  •  9
  •   Paul Sasik    16 年前

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

    这是我做这类工作时一次又一次的经历。如果您需要十几个控件,请选择“所有者绘制”。

    链接到 custom WPF drawing sample

        2
  •  1
  •   Larry Watanabe    16 年前

    我自己也是一个4-D围棋玩家:)你可能想创建一个棋盘位图,然后重新绘制已经更改的部分。

        3
  •  0
  •   YotaXP    16 年前

    我知道这可能无法真正回答问题,但我认为值得指出。

    WPF4将在不久的将来推出,它将支持元素图形的缓存,在许多情况下不需要重画。在想要利用这一点的元素上添加几个属性,就可以开始了。如果您最终使用了此选项,请尝试避免不必要的动画。如果屏幕上的每个元素都需要在每一帧上重画,那么缓存东西就没有意义了。翻转动画就可以了。

        4
  •  0
  •   Eric Ouellet    14 年前

    将当前窗口的RenderOptions.EdgeMode设置为“未指定”(无抗锯齿)

    你应该有更好的表现,但有些粗糙的绘图。

    祝你好运

    推荐文章