慎用 out
从其它平台迁移而来 最近需要评估一下海康摄像头不同抓拍方式的性能,以及封装类的可靠性。 在测试过程中,又发现了当初遇见的设备内存抓拍报错的问题。当初排查的结论是:当封装类开启预览的情况下,使用设备抓图有较高概率抓拍失败。由于预览是必需的,最终选择了预览抓拍。 现在,换用lazarus进行测试,发现设备抓图必失败,与是否预览无关。一点点调试,发现直接调用SDK原始方法进行设备抓图正常,使用封装类的设备抓图就不行,那肯定是封装类出了问题。 最终发现,封装类的设备抓图使用了out来修饰参数,参数是TMemoryStream和TJPEGImage对象,尝试去掉out修饰符,然后就一切正常了。 记得很久前专门研究过out和var修饰符的区别,当时查阅的结果是:out和var修饰的参数都是传址的,区别是out会对参数进行初始化,而var则不会。 另外,参数为对象的情况,实际也是传址的。 本次发现的问题可能就是使用out来修饰对象参数导致的,但并没有进行进一步的测试。 附 测试环境 操作系统:win10 硬盘:SSD 测试结果 子码流预览抓图,耗时毫秒级;主码流预览抓图,耗时10+毫秒级 预览抓图比设备拍图耗时少得多,设备抓图在100+毫秒级 在相同分辨率情况下,预览抓图的文件大小比设备抓图的略大