16
|
TheCloudlessSky · 技术社区 · 14 年前 |
1
9
当然,您可以使用Pens和brush类,这些类为您提供运行时已经创建的对象。
同样的,你也可以用同样的方法 Brushes ,如果您只需要标准纯色笔刷颜色:
如果你想要你自己创造的不同颜色,例如用不同的alpha组件,或者渐变笔刷,那么你仍然需要自己创造这些颜色并适当地清理它们。 编辑: 在我古老的XP机器上,以调试模式运行一个测试应用程序,创建和处理一个100000支新钢笔的数组大约需要半秒钟。 相当于每支笔大约5微秒 . 只有你能决定这对你来说是否足够快。我冒昧地猜测,这一次对你们其余的行动来说可能是微不足道的。 |
2
3
您只能通过在特定应用程序上进行测试来了解性能影响,但是在应用程序的生命周期中,框架似乎不存在保留几支笔的问题。你第一次打电话
为每个对象提供一支在设置前景色时创建的专用笔,并在所有绘画中重复使用。你应该使你的对象可以识别,这样它就可以正确地处理那支笔了。
|
3
2
|
4
0
是的,最好像@fantius建议的那样进行测试,你可能会发现这其实并不重要——尽管我会临时保持它们打开,好像我正确地回忆起它们是非托管资源,可能会耗尽你的内存。如果每次都要重新创建它们,则需要特别小心地正确处理它们,以避免内存泄漏。 |
5
0
好吧,这是一个老问题,对某些人来说可能是新问题,有一个简单直观的解决方案,然后是一个详细的解释。 “我应该保持绘画资源,如钢笔和刷子,比什么是需要执行我的绘画操作的时间长”,问题是重新措辞?答案是不,你不应该在这种情况下;但是为什么,这是什么意思? 当你绘制一个图形对象时,你正在为你创建的每个绘制对象使用内存密集型的资源,比如钢笔、画笔、路径、矩阵等等。 是的,为绘画创作钢笔、画笔等myPen.dispose文件()并紧接着do释放对已释放对象的所有对象引用,方法是将该对象树设置为null,例如(myPen=null;),这允许垃圾收集器释放这些对象所持有的非托管内存,而不必等待对对象的调用完成()。请参见: Garbage collection “创建太多的这些IDisposable类对象,并且在完成时不释放这些对象” Using Stack and Heap 更多信息。 故事的寓意是释放你不再需要的资源;如果你必须保留资源,当你“保留资源”时,测试对性能的潜在影响,希望避免负面后果。 经验法则:尽可能确保在退出“绘制事件”例程时释放所有资源。最好是,当您的每个paint事件方法完成时,该方法隐式创建的任何资源也应该完成。惩罚是,传递给诸如画笔和画笔等方法的任何对象引用*都将被保留,直到调用基本对象finalize为止,这超出了必要的时间,并且在定义的一般术语中可以被视为内存泄漏。*传递太多的引用意味着在比预期或假设的时间更长的时间内不可用的内存。 注意:小心地将对象引用(如笔和画笔)传递给方法,如果这样做,则在类级别实现IDisposable接口以执行绘制。你的作业越来越贵了,建议你去看看 IDisposable interface . 快乐画画! |
F.Fipoo · 如何将屏幕截图写入PNG? 7 年前 |
DonBoitnott · 将图标转换为Png 8 年前 |
techno · 调整图像大小保持纵横比白线边框 8 年前 |
Ian Boyd · 如何将GDI+位图放置到剪贴板上? 8 年前 |
Vadims Samsinovs · 重绘图像的最有效方法 10 年前 |
DanyR · 如何在gdi中正确绘制地图坐标+ 10 年前 |