我正在尝试在 WPF 中创建一个自定义控件来显示游戏树围棋游戏 http://en.wikipedia.org/wiki/Go_(game) (see here http://i46.tinypic.com/ickz11.png看起来像什么)。我或多或少已经完成了节点的布局,但我发现的一个问题是,当节点数量大于大约时,渲染/导航(在滚动查看器中)会明显变慢30. 由于围棋游戏平均包含约 200 步棋(更不用说玩家可能会分叉的其他分支),因此这在任何现实游戏中都将是一个相当大的问题。
目前,我正在对游戏节点使用单独的用户控件(每个节点都是一个带有阴影位图效果和一些文本注释的椭圆),并为树中的弧线使用简单的线条,所有这些都绝对定位在画布中。
布局算法不是这样的问题,因为这只需要在创建新分支时执行(否则该节点可以直接添加到其父节点下方,因此不需要重新定位其他节点)。主要问题在于,对该画布及其元素的任何类型的操作都非常慢,大概只是由于它拥有的子元素数量所致。随着树的宽度和复杂性的增加,它显然会变得更慢,因为有更多的弧和节点。
我的问题:绘制这样的大型/复杂结构的正确方法是什么,使其不会随着其增长而渲染得太慢?
Edit:这与我的另一个问题 https://stackoverflow.com/questions/1985542/translatepoint-within-a-canvas.
Edit:这是我用于节点的用户控件的标记:
<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>
这些被动态添加到画布中以绘制树。
渲染控件实际上相当昂贵。如果您在客户区中进行自定义绘图(自己绘制项目而不是放置控件),您将看到性能显着提高。
这是我在从事此类工作时一次又一次的体会。如果您需要十多个控件,请选择“所有者绘制”。
顺便说一句,不要让自定义绘图吓倒您。它并不比动态放置控件复杂多少。
Link to 自定义 WPF 绘图示例 http://msdn.microsoft.com/en-us/library/ms747393.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)