Unity中使用PhotoCapture在Hololens上连拍时出现内存泄漏问题
问题原因
底层非托管资源泄漏未被Unity Profiler统计
你当前每3秒完整执行一次PhotoCapture实例创建→开启拍照模式→拍照→关闭模式→销毁实例的全流程,Hololens的PhotoCapture底层依赖Windows原生相机API,这类API分配的非托管内存不属于Unity托管堆范围,不会被Unity Profiler统计,这就是你看不到内存占用上升但页文件被耗尽的核心原因。频繁创建销毁相机实例会导致底层残留大量未被回收的非托管缓冲,持续占用页文件空间。PhotoCaptureFrame未主动释放OnCapturedPhotoToMemory回调返回的PhotoCaptureFrame实现了IDisposable接口,即便你没有读取其中的纹理数据,也需要主动调用Dispose()释放其底层持有的像素缓冲,否则这类非托管资源不会被GC自动及时回收,多次积累后会占用大量系统空间。异步操作重叠导致资源重复分配
整个拍照流程是异步执行的,如果某一次拍照流程耗时超过3秒,你还没等上一次的PhotoCapture实例销毁,就触发了下一次实例创建逻辑,会导致同时存在多个活跃的相机实例,进一步放大资源泄漏问题。
修复方案
- 调整
PhotoCapture生命周期逻辑,程序启动时仅初始化一次PhotoCapture实例、开启一次拍照模式,多次拍照直接复用同一个实例调用TakePhotoAsync即可,程序退出时再统一执行停止模式、销毁实例的操作,避免频繁重建实例。 - 在
OnCapturedPhotoToMemory回调中新增photoCaptureFrame.Dispose()调用,主动释放帧缓冲资源。 - 新增拍照状态锁,例如定义
bool isCapturing变量,拍照开始时设为true,整个拍照流程执行完成后再设为false,Update中仅在isCapturing为false时触发下一次拍照,避免异步操作重叠。
内容的提问来源于stack exchange,提问作者lain
相关产品推荐
相关产品推荐

