Android setPreviewCallback()和setPreviewCallbackWithBuffer()

Android setPreviewCallback()和setPreviewCallbackWithBuffer(),android,android-camera,Android,Android Camera,我有一个代码,可以访问来自前置摄像头的帧流,并将它们推送到处理到背景线程。现在我根本不使用任何缓冲区,一切正常(在我的手机上) 因此,对于这个特定任务,setPreviewCallback()与setPreviewCallbackWithBuffer()有何不同的问题?后台处理的差异可能很大。相机缓冲区可能很大,并且setPreviewCallback()会对每个帧进行单独分配(希望每秒30次)。这可能会对JVM造成很大压力,因为缓冲区不会立即释放(并且GC不能依赖年轻一代优化) setPrev

我有一个代码,可以访问来自前置摄像头的帧流,并将它们推送到处理到背景线程。现在我根本不使用任何缓冲区,一切正常(在我的手机上)


因此,对于这个特定任务,
setPreviewCallback()
setPreviewCallbackWithBuffer()
有何不同的问题?

后台处理的差异可能很大。相机缓冲区可能很大,并且
setPreviewCallback()
会对每个帧进行单独分配(希望每秒30次)。这可能会对JVM造成很大压力,因为缓冲区不会立即释放(并且GC不能依赖年轻一代优化)

setPreviewCallbackWithBuffer()
重用预先分配的缓冲区,涉及GC。这还提供了一种简单的机制,可以为您的后台处理器获得足够的帧。例如,如果只预先分配2个帧缓冲区,则在发送两个帧进行处理后,在调用
addCallbackBuffer()
释放缓冲区之前,不会捕获第三个帧(也减少了复制像素的CPU使用量)

小心不要掉入这样的陷阱:如果您提前释放缓冲区,您将承受活页夹复制实际丢弃的像素的开销