GDI +中的经验法则

时间:2009-08-18 15:33:12

标签: .net graphics gdi+ rules-of-thumb

我一直在研究.NET中的一些GDI +代码,并且一直在努力学习我的课程。简单的事情如:

  • 在屏幕上看起来不错的东西在纸上看起来不太好,反之亦然
  • 缓存太多对象可能导致OutOfMemoryException
  • 花车不精确

......等等。我相信有经验的人可以添加更多内容。

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

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

7 个答案:

答案 0 :(得分:5)

尽可能晚地创建对象(不要过早地优化/缓存)并尽早释放它们(如果IDisposable,则调用Dispose或wrap in using statement)。

答案 1 :(得分:2)

不要避免使用非托管呼叫,正确完成后可以加快速度。

答案 2 :(得分:2)

在逻辑/屏幕坐标之间进行转换时要小心。如果在错误的时间完成,你可能会耗尽精确度,并获得一些讨厌的绘图工件。

最后一次,我试图计算逻辑坐标中的新点;那些已经接近精确度的极限,所以新的观点并不是人们所希望的。转换更快修复它。

通过过早转换为屏幕坐标可能会出现类似的问题,尽管允许您传递浮点坐标(GDI +所做的)的API往往会更加强大。

答案 3 :(得分:2)

不要画得比你多。

通常,绘图操作比您将要执行的其他计算更昂贵(特别是在GDI +中,这是一个很好的API但不是最快的绘图库)。在你自己的代码中花费更多的时间来避免不必要的绘图操作(例如,不止一次地绘制相同的东西)通常是值得的。

答案 4 :(得分:2)

GDI陷阱让我烧了几次。

  • 克隆不克隆()底层数据克隆(Rectangle,PixelFormat)。因此,如果丢弃clone(),原始对象将变得无法使用。如果您需要两个单独的位图,请使用新的Bitmap()。
  • 如果您加载图像FromFile,该文件将被锁定,直到位图被丢弃(甚至无法读取)。
  • 使用DrawImage时,不要忘记设置SmoothingMode,InterpolationMode和PixelOffsetMode,否则您会对图像的低质量感到惊讶。

答案 5 :(得分:1)

并非严格意义上的GDI +问题,但要记住这一点,以节省几个小时的调试时间:

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

g->Transform->Translate(100.0f, 250.0f);    // WRONG. Will not have any effect.

Transform属性的getter只返回矩阵的副本。因此,调用此副本的任何方法都不会影响图形转换的值。要操作图形转换,请调用其中一个包装器方法(MultiplyTransformTranslateTransformScaleTransform等),如下所示。

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

答案 6 :(得分:1)

请注意使用区域的方式:http://steveperks.com/post/Fun-With-GDI2b-Bugs.aspx