【发布时间】:2009-07-31 14:10:37
【问题描述】:
我正在使用 Windows C++ 编程。 我想知道在屏幕上绘制 DIB 的禁食方法是什么。 图片可能被拉伸了。
比 StretchDIBits 快,比 SetDIBitsToDevice 快。 比 StretchBits 快。
并具有高拉伸质量。
非常感谢!
【问题讨论】:
标签: c++ performance stretch dib
我正在使用 Windows C++ 编程。 我想知道在屏幕上绘制 DIB 的禁食方法是什么。 图片可能被拉伸了。
比 StretchDIBits 快,比 SetDIBitsToDevice 快。 比 StretchBits 快。
并具有高拉伸质量。
非常感谢!
【问题讨论】:
标签: c++ performance stretch dib
我认为 API 函数 StretchDIBits 将利用硬件。除此之外,看看BitBlt / StretchBlt。
此外,如果您采取那条路线,您可能会查看一些与StretchDIBits 相关的other questions。
如果您对这些方法不满意,我不知道还能告诉您什么。你的 CPU 只能做这么多。确保您在可以且仅在updating what you need 时缓存操作结果。查看OpenGL 或DirectX 以充分利用您的显卡。
【讨论】:
当我看到 Windows 源代码时记得,Stretchblt 是 1980 年代中期由一名暑期实习生编写的,但从未得到修复。所有版本的 Windows 都采用了相同的低效代码。在一些 Windows 移动设备上,StretchBlt 将利用 2D 硬件加速,但不能在桌面 Windows 上。在桌面窗口上使用 DirectDraw 以利用 2D 硬件加速并获得快速 blit。在我的桌面视频游戏产品中,我有自己的 Stretchblt 代码,它可以拉伸内存缓冲区中的位,然后调用 BitBlt 将它们复制到显示器,这比简单地调用 StretchBlt 快得多。
我认为 StretchBlts 失败的主要原因是代码完全忽略了缓存/非缓存内存的速度,并且在拉伸图像时会破坏缓存。
【讨论】: