首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高wpf中绘制平铺位图的性能

提高wpf中绘制平铺位图的性能
EN

Stack Overflow用户
提问于 2011-06-02 12:11:53
回答 3查看 1.6K关注 0票数 2

我正在寻找一种方法来提高我正在做的一些绘图的性能。目前它是一个32x32网格的瓷砖,我正在绘制。使用以下代码在绘图上下文上绘制

代码语言:javascript
复制
for (int x = startX; x < endX; x++)
        {
            for (int y = startY; y < endY; y++)
            {
                dg.Children.Add(
                    new ImageDrawing(_mapTiles[GameWorldObject.GameMap[x, y].GraphicsTile.TileStartPoint],
                        new Rect(CountX * 8, CountY * 8, 8, 8)
                        ));

                dg.Children.Add(
                    new GeometryDrawing(
                        null,
                        new Pen(
                            new SolidColorBrush(
                                Color.FromRgb(255, 0, 20)), .3), 
                                new RectangleGeometry(
                                    new Rect(CountX * 8, CountY * 8, 8, 8)
                                )
                            )
                        );

                CountY++;
            }
            CountY = 0;
            CountX++;
        }

        dc.DrawDrawing(dg);

我正在绘制的图像是一个CachedBitmap。即使使用CachedBitmap,每次我需要重新绘制画布时,仍然会有大约半秒的延迟。

不确定是否有更好的方法来处理此网格的绘图。最终,我想将控件扩展为一个迷你地图,所以我需要记住这一点。

另外,我之前也尝试过将每个位图直接绘制到绘图上下文中,但这似乎有点慢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-04 22:45:33

我在绘制之前添加了DrawingGroup.Freeze(),它似乎对性能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2011-06-02 13:49:31

如果它主要是静态的小地图,将它绘制成一个图像,并绘制该图像。或者你可以做一个大图,你把整个地图画进去,然后只画出它当前可见的部分。

编辑:也许this blog post值得一看,无论你是用软件还是硬件加速来绘制它。

票数 0
EN

Stack Overflow用户

发布于 2011-06-04 09:24:12

这里有一个使用WriteableBitmap的例子,它的性能主要与整个地图的大小有关,而你的原始方法更多地依赖于分片的数量。您可以将其更改为在平铺之间具有alpha混合的边界,但在它们之间留出间隙会更容易,性能也更好。你不需要代码随机化磁贴,但你应该有一些脏的标志,所以你只在它改变时重新绘制位图。

你可能还想看看我和其他人的答案,看看这个question。这就是说,你没有那么多的项目,使用你的方法的32x32对我来说并不慢。

代码语言:javascript
复制
<local:Map x:Name="map" />
<RepeatButton Click="Button_Click" Content="Change" />
代码语言:javascript
复制
private void Button_Click(object sender, RoutedEventArgs e)
{
    map.seed++;
    map.InvalidateVisual();
}
代码语言:javascript
复制
public class Map : FrameworkElement
{
    private int[][] _mapTiles;

    public Map()
    {
        _mapTiles = Directory.GetFiles(@"C:\Users\Public\Pictures\Sample Pictures", "*.jpg").Select(x =>
        {
            var b = new BitmapImage(new Uri(x));
            var transform = new TransformedBitmap(b, new ScaleTransform((1.0 / b.PixelWidth)*tileSize,(1.0 / b.PixelHeight)*tileSize));
            var conv = new FormatConvertedBitmap(transform, PixelFormats.Pbgra32, null, 0);
            int[] data = new int[tileSize * tileSize];
            conv.CopyPixels(data, tileSize * 4, 0);
            return data;
        }).ToArray();

        bmp = new WriteableBitmap(w * tileSize, h * tileSize, 96, 96, PixelFormats.Pbgra32, null);
        destData = new int[bmp.PixelWidth * bmp.PixelHeight];
    }

    const int w = 64, h = 64, tileSize = 8;
    public int seed = 72141;
    private int oldSeed = -1;
    private WriteableBitmap bmp;
    int[] destData;

    protected override void OnRender(DrawingContext dc)
    {
        if(seed != oldSeed)
        {
            oldSeed = seed;
            int startX = 0, endX = w;
            int startY = 0, endY = h;
            Random rnd = new Random(seed);

            for(int x = startX; x < endX; x++)
            {
                for(int y = startY; y < endY; y++)
                {
                    var tile = _mapTiles[rnd.Next(_mapTiles.Length)];
                    var rect = new Int32Rect(x * tileSize, y * tileSize, tileSize, tileSize);
                    for(int sourceY = 0; sourceY < tileSize; sourceY++)
                    {
                        int destY = ((rect.Y + sourceY) * (w * tileSize)) + rect.X;
                        Array.Copy(tile, sourceY * tileSize, destData, destY, tileSize);
                    }
                }
            }

            bmp.WritePixels(new Int32Rect(0, 0, w * tileSize, h * tileSize), destData, w * tileSize * 4, 0);
        }

        dc.DrawImage(bmp,new Rect(0,0,w*tileSize,h*tileSize));
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6210264

复制
相关文章

相似问题

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