【问题标题】:Could this tile blitter get any faster? [duplicate]这种瓷砖吸尘器能更快吗? [复制]
【发布时间】:2009-06-12 19:01:07
【问题描述】:

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

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

与 QuickBasic PSET 与 POKEing 显存或 VB6 的 PSet 与 WinAPI 的 SetPixel 的速度形成鲜明对比,简单的 Get/SetPixel 循环与 DrawImageUnscaled 调用一样快,但裁剪只有 DrawImage 才会这样做。

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

【问题讨论】:

  • 这不是您问题的真正答案,但您可以通过定义图像的整个矩形 -> X、Y、宽度、高度来提高 DrawImage 的速度。在我的测试中,我实现了大约 20% 的加速。

标签: .net optimization performance tiles


【解决方案1】:

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

【讨论】:

  • 至少脖子明显变宽了。
【解决方案2】:

一个简单的 Get/SetPixel 循环同样快 作为 DrawImageUnscaled 调用

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-09-08
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    相关资源
    最近更新 更多