C#GDI + / System.Drawing.Graphics - 创建缓冲区并手动blitting?

时间:2011-03-21 11:27:36

标签: c# winforms graphics drawing gdi+

我正在创建一个处理非常大的图像文件的cad查看器,我正在尝试以尽可能高的帧速率和低内存占用来优化它。

它使用GDI +渲染到面板上。

目前的缺陷是图像渲染。我正在使用的一些文件参考图像特别大(8000x8000像素)。我已经优化了内存使用量,只是在它们变得可见时加载它们并在它们不可用时处理它们。这样可以减少程序内存耗尽的可能性,但可以防止图像过于频繁地加载和卸载;然而,渲染图像本身(context.DrawImage)仍然会带来非常大的开销。

我现在正在探索将图像blitting到某种较小缓冲区的方法,渲染这个(通常小得多)缓冲区,然后在缩放级别发生显着变化时刷新/重建它。

问题是,我无法在GDI中找到任何相关规定。任何人都可以建议我如何实现它?

4 个答案:

答案 0 :(得分:2)

我认为GDI不是为图像的高速更新而设计的。如果您尝试滚动图像,并在每次移动时跟踪鼠标,请尝试移动图像的各个部分并填充由移位打开的空间。基本上重用程序员在CPU缓慢且RAM很小的情况下平滑滚动/平移图形时使用的技巧。

答案 1 :(得分:2)

如果您正在创建一个需要高帧率并正在寻找建议的新图形应用程序,那么我建议放弃GDI +并使用WPF。 WPF使用硬件加速并支持保留模式图形;与GDI +相比,这项工作的性能要好得多。

如果有禁止WPF的限制,请在您的问题中解释。这是相关的,因为这些限制也会影响GDI +绘图。

答案 2 :(得分:0)

GDI支持Direct3D,因为无论如何3D元素都进入了等式。图像变成单个缩略图和根据需要加载/输出的较大图块。

答案 3 :(得分:0)

在开发自己的GIS应用程序时遇到了类似的问题。我发现的最佳解决方案(即使使用WPF)是平铺大图像并仅显示可见部分。这就是说,我会切换到WPF,不仅是出于上述答案中给出的原因,而且还提供了良好的成像支持。有关详细信息,请参阅this链接