前言
众所周知,C#是一个带垃圾回收机制的语言,开发过程中不需要考虑垃圾回收,你就可劲造吧。但我们在设计图像处理软件时,应时刻对图像等大内存资源进行管控,做到自行管控,及时释放,不应将其交由GC进行回收,遵循C++的开发原则
实际开发过程中,若全部图像都由GC进行回收,会导致以下两点问题:
1)内存波动性大,CPU处理密集时,内存会呈现断崖式起伏
2)算法检测时间极其不稳定,由于GC时回收大内存导致
所以开发过程中,应遵循以下几个原则:
一、谁用谁销毁
自己创建对象(Image/Region/XLD/ObjectModel3D等),谁创建的谁销毁(前提是外部不需要使用的情况),自行使用完及时执行Dispose操作
HImage image = new HImage("byte", 16384, 3000);
HRegion region = image.Threshold((double)0, 255);
//do someting
region.Dispose();
image.Dispose();
二、谁用谁新建
假设说某处创建的对象,另一处需要使用,另一处的应自己new一份进行使用,使用完毕后自己Dispose掉(halcon在设计时大部分对象都是采用智能指针的方式,不会消耗额外的内存)
HImage image = new HImage("byte", 16384, 3000);
HRegion region = image.Threshold((double)0, 255);
HImage userImage = new HImage(image);
HImage userRegion = new HImage(region);
region.Dispose(); //及时释放
image.Dispose();
//user do something
userImage.Dispose(); //用完后释放
userRegion.Dispose();
三、能复用地址就少创建图片
能尽量复用原有指针的情况下,就少进行内存新建,重复额外的内存开销是没必要的
参考:C#+Halcon 垂直拼接/裁切避免频繁开辟内存-CSDN博客