4

当我在 C# 中创建基于图块的地图编辑器时,我倾向于遍历 X、Y 轴并调用 Graphics.DrawImage() 以将单个图块从图块集位图到地图位图上。这个过程需要几秒钟才能完成,所以我只在加载新地图或更改其图块集时执行一次。从那里开始的任何编辑都是相对快速的仅已编辑图块的块。

现在,我今天早些时候坐下来考虑我的选择。Graphics.DrawImage() 是三个(其他是 DrawImageUnscaled 和 DrawImageUnscaledAndCropped(?))中唯一允许指定源原点的一个。DrawImageUnscaled()快得多,但总是从源位图的左上角开始。

与 QuickBasic PSET 与 POKEing 视频内存的速度或 VB6 的 PSet 与 WinAPI 的 SetPixel 的速度形成鲜明对比的是,简单的 Get/SetPixel 循环与 DrawImageUnscaled 调用一样快,但进行了只有 DrawImage 才能进行的裁剪。

现在这已经足够快了,但我想知道像直接图像处理这样的东西如何能更快地加快速度?可能是 LockBits 的东西,一个我几乎一无所知的功能?

4

2 回答 2

1

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

于 2009-06-12T19:04:41.810 回答
1

一个简单的 Get/SetPixel 循环与 DrawImageUnscaled 调用一样快

那么你肯定做错了什么。GetPixelandSetPixel方法有相当多的开销,使用任何方法DrawImage都应该快 100 倍(除非你的图块非常小,比如 2x2 像素)。

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

如果您以不变的大小绘制图像,您可以更改Graphics对象中的质量设置以调整速度。例如,您可以将InterpolationMode属性设置为NearestNeighbor以防止它进行任何插值。

在位图上绘图的另一种方法是使用LockBitsUnlockBits直接访问位图的像素数据。

于 2009-06-12T19:30:41.153 回答