我有一个代码,可以从前置摄像头访问帧流,并将它们推送到后台线程处理.现在我根本没有使用任何缓冲区,一切正常(在我的手机上).
那么问题setPreviewCallback()
与setPreviewCallbackWithBuffer()
这个特定的任务有何不同?
后台处理的差异可能很大.相机缓冲区可能很大,并且setPreviewCallback()
会导致每帧的单独分配(希望每秒30个).这可能会对JVM造成巨大压力,因为缓冲区不会立即释放(并且GC不能依赖于年轻代优化).
setPreviewCallbackWithBuffer()
重用预先分配的缓冲区,并涉及GC.这也提供了一种简单的机制,可以为后台处理器提供足够的帧.例如,如果您只预先分配2个帧缓冲区,那么在您发送两个帧进行处理之后,将不会捕获第三帧(减少用于复制像素的CPU使用率),直到您调用addCallbackBuffer()
释放缓冲区为止.
注意不要陷入额外锁定的陷阱:如果你提前释放缓冲区,你会遭受Binder复制你实际丢弃的像素的开销.