GDI+中的经验法则

3

我一直在.NET上处理一些GDI+代码,通过艰难的学习得到了经验。例如:

  • 屏幕上看起来好看的东西,在纸上可能并不美观,反之亦然
  • 缓存太多对象可能会导致OutOfMemoryException异常
  • 浮点数并不是精确的

......等等。我相信有很多经验丰富的人可以补充更多。

使用GDI+或任何图形库时应遵循哪些好的规则?

每个帖子提供一个有用的提示将会很好。谢谢。


GDI+中XY值的硬限制 - Agnel Kurian
7个回答

5
尽量晚地创建对象(不要过早地进行优化/缓存),并尽早释放它们(调用Dispose或使用using语句包装,如果是IDisposable的话)。

2
不要避免使用非托管调用,当正确使用时,它可以显著提高速度。

2

在逻辑坐标和屏幕坐标之间进行转换时要小心。如果在错误的时间进行转换,则可能会因精度不足而获得一些令人讨厌的绘图伪像。

上次我遇到这个问题是在尝试计算逻辑坐标中的新点,但这些已经接近精度限制了,所以新点并不完全符合预期。更早地进行转换可以解决此问题。

如果太早地转换为屏幕坐标,也可能会出现类似问题,但允许您传递浮点坐标的 API(如 GDI+)往往更加健壮。


2

不要画更多的图形。

一般来说,绘图操作比你执行的其他计算更耗费资源(特别是在GDI+中,它是一个不错的API,但不是最快的绘图库)。在自己的代码中花费一些时间避免不必要的绘图操作(例如重复绘制相同的内容)往往是非常值得的。


2

GDI中的陷阱,曾经让我受过几次伤。

  • Clone方法并不会克隆底层数据,只有clone(Rectangle, PixelFormat)方法才会。所以如果你释放了一个clone()对象,原始对象就无法使用了。如果你需要两个独立的位图,请使用new Bitmap()方法。
  • 如果你使用FromFile方法加载图片,那么文件将被锁定,直到位图被释放(甚至不能读取)。
  • 在使用DrawImage时,请注意设置SmoothingMode、InterpolationMode和PixelOffsetMode,否则你会惊奇于图像的低质量。

1

虽然这不是 GDI+ 的问题,但要记住这一点,以节省您几个小时的调试:

在 .NET 中使用 GDI+ 时,我经常犯的一个错误是在 Graphics 对象的 Transform 属性上调用 Matrix 方法。例如(在 C++/CLI 中):

g->Transform->Translate(100.0f, 250.0f);    // WRONG. Will not have any effect.
< p > Transform 属性的 getter 方法只返回矩阵的 副本。因此,在此副本上调用的任何方法都不会影响图形变换的值。要操作图形变换,请调用下面所示的包装器方法之一(MultiplyTransformTranslateTransformScaleTransform 等)。

g->TranslateTransform(100.0f, 250.0f);

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接