我一直在.NET上处理一些GDI+代码,通过艰难的学习得到了经验。例如:
- 屏幕上看起来好看的东西,在纸上可能并不美观,反之亦然
- 缓存太多对象可能会导致OutOfMemoryException异常
- 浮点数并不是精确的
......等等。我相信有很多经验丰富的人可以补充更多。
使用GDI+或任何图形库时应遵循哪些好的规则?
每个帖子提供一个有用的提示将会很好。谢谢。
在逻辑坐标和屏幕坐标之间进行转换时要小心。如果在错误的时间进行转换,则可能会因精度不足而获得一些令人讨厌的绘图伪像。
上次我遇到这个问题是在尝试计算逻辑坐标中的新点,但这些已经接近精度限制了,所以新点并不完全符合预期。更早地进行转换可以解决此问题。
如果太早地转换为屏幕坐标,也可能会出现类似问题,但允许您传递浮点坐标的 API(如 GDI+)往往更加健壮。
不要画更多的图形。
一般来说,绘图操作比你执行的其他计算更耗费资源(特别是在GDI+中,它是一个不错的API,但不是最快的绘图库)。在自己的代码中花费一些时间避免不必要的绘图操作(例如重复绘制相同的内容)往往是非常值得的。
GDI中的陷阱,曾经让我受过几次伤。
虽然这不是 GDI+ 的问题,但要记住这一点,以节省您几个小时的调试:
在 .NET 中使用 GDI+ 时,我经常犯的一个错误是在 Graphics
对象的 Transform
属性上调用 Matrix
方法。例如(在 C++/CLI 中):
g->Transform->Translate(100.0f, 250.0f); // WRONG. Will not have any effect.
< p > Transform
属性的 getter 方法只返回矩阵的 副本。因此,在此副本上调用的任何方法都不会影响图形变换的值。要操作图形变换,请调用下面所示的包装器方法之一(MultiplyTransform
、TranslateTransform
、ScaleTransform
等)。
g->TranslateTransform(100.0f, 250.0f);