2009-06-12 47 views
4

当我在C#中创建一个基于图块的地图编辑器时,我倾向于遍历X,Y轴并调用Graphics.DrawImage()来将单个图块从地图块位图移动到地图位图上。这个过程需要几秒钟才能完成,因此我只在加载新地图或更改其地图集时执行一次。从那里进行的任何编辑都是相对较快的只有编辑后的图块。这个瓦片阻挡器可以更快吗?

现在,我今天早些时候回头想起了我的选择。 Graphics.DrawImage()是三个中的唯一一个(其他是DrawImageUnscaled和DrawImageUnscaledAndCropped(?)),允许指定源原点。 DrawImageUnscaled()很多,太多更快,但总是从源位图的左上角传出。

在与QuickBasic PSET与POKEing显存,或VB6的PSET的与WinAPI的的SetPixel速度形成鲜明对比,简单的GET/SetPixel循环是快如DrawImageUnscaled呼叫,但做了裁剪,只有的DrawImage会否则。

现在速度已经够快了,但我想知道直接图像处理是如何加快速度的呢? LockBits也许,我知道的一个功能什么也没有?

+1

这实际上并不是您问题的答案,但您可以通过定义图像的整个矩形 - > X,Y,宽度,高度来提高DrawImage的速度。在我的测试中,我实现了大约20%的加速。 – 2013-04-02 07:30:56

回答

1

软件blitting似乎是一个严重的瓶颈。我会认真的建议寻找硬件加速绘图这样的任务。

+0

至少脖子明显变宽了。 – Kawa 2009-06-12 19:14:29

1

简单的GET/SetPixel循环是快速 作为DrawImageUnscaled呼叫

那么你肯定做错了什么。 GetPixelSetPixel方法有相当的开销,使用任何DrawImage方法应该快100倍(除非也许如果你的瓷砖非常小,像2×2像素)。

与其名称相反,DrawImageUnscaled方法在不调整大小的情况下不绘制。相反,它使用图像的PPI设置将它们缩放到相同的测量值。这意味着如果你有一个设置为100 PPI的位图,并在设置为50 PPI的位图上绘制它,它将被调整为双倍大小。

如果您以不变的大小绘制图像,则可以更改Graphics对象中的质量设置以调整速度。例如,您可以将InterpolationMode属性设置为NearestNeighbor,以防止其进行任何插值。可以使用LockBitsUnlockBits来直接访问位图的像素数据。