2009-08-18 66 views
3

我一直在研究.NET中的一些GDI +代码,并一直在努力学习我的教训。喜欢简单的事情:GDI中的经验法则+

  • 什么在屏幕上看起来不错可以不看在纸上不错,反之亦然
  • 缓存对象太多可能会导致一个OutOfMemoryException
  • 浮标可能不准确,

...等等。我相信经验丰富的人可以增加更多。

当使用GDI +或任何图形库时,遵循什么规则?

每篇文章一个有用的提示将很好。谢谢。

+0

[在GDI + XY值硬限制(http://stackoverflow.com/questions/3468495) – 2010-08-12 17:51:28

回答

5

尽可能晚地创建对象(不要过早地优化/缓存)并尽早释放它们(调用Dispose或使用IDisposable语句封装)。

2

不要避免使用非托管调用,它可以加快正确完成了很多事情。

2

当您在逻辑/屏幕坐标之间进行转换时,小心谨慎。如果在错误的时间完成,你可能会用完精确度并得到一些令人讨厌的绘图工件。

最后一次这个位我,我试图计算一个新的逻辑坐标点;那些已经接近精度的极限了,所以新的观点并不完全符合人们的希望。尽快进行转换修复。

虽然API允许您将浮点坐标传递给GDI +,但通过转换到屏幕坐标的速度可能会很快,但可能会出现类似的问题。

2

不要画得比你更多。

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

2

GDI Gotchas已经烧了我几次。

  • 克隆不克隆()基础数据克隆(Rectangle,PixelFormat)。所以如果你处理一个克隆(),原始对象变得不可用。如果你想要两个独立的位图,使用新的位图()。
  • 如果您加载图像FromFile,那么该文件被锁定,直到位图被丢弃(甚至不能被读取)。
  • 使用DrawImage时,请不要忘记设置SmoothingMode,InterpolationMode和PixelOffsetMode,否则您会对图像的低质量感到惊讶。
1

不是严格意义上的GDI +问题,但记住这保存自己几个小时的调试:

一个错误我犯了过于频繁地使用GDI +在.NET中是调用的Transform财产Matrix方法Graphics对象。实施例(在C++/CLI):

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

Transform属性的吸气剂只返回矩阵的拷贝。因此,在此副本上调用的任何方法都不会影响图形变换的值。要操作图形变换,请调用其中一种包装方法(如下所示)(MultiplyTransform,TranslateTransform,ScaleTransform等)。

g->TranslateTransform(100.0f, 250.0f); 
相关问题