2011-03-21 18 views
6

我正在创建一个处理非常大的图像文件的cad查看器,并且我正在尽可能优化帧率和内存占用空间。C#GDI +/System.Drawing.Graphics - 创建一个缓冲区并手动blitting?

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

目前的缺陷是图像渲染。我使用的一些文件参考图像特别大(8000x8000像素)。我已经优化了内存使用情况,只有在它们变得可见时加载它们,并在它们不存在时将它们处理掉。这样可以减少程序运行内存不足的可能性,但会妨碍图像经常加载和卸载;然而渲染图像本身(context.DrawImage)仍然带来非常大的开销。

我现在正在探索如何将图像分块成更小的缓冲区,渲染缓冲区(通常小得多),然后在缩放级别发生显着变化时刷新/重建缓冲区。

问题是,我无法在GDI中找到这方面的任何条款。任何人都可以建议我如何实现它?

回答

0

GDI归因于Direct3D,因为3D元素无论如何都进入了方程。图像变成单个缩略图和更大的瓷砖,根据需要装入/退出。

2

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

2

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

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

0

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