我有一个代码,可以访问来自前置摄像头的帧流,并将它们推送到后台线程的处理。现在我根本不使用任何缓冲区,一切正常(在我的手机上)。
那么对于这个特定的任务来说,setPreviewCallback()
与setPreviewCallbackWithBuffer()
有什么不同呢?
最佳答案
背景处理的差异可能很大。相机缓冲区可能很大,并且setPreviewCallback()
会对每个帧进行单独的分配(希望是每秒30帧)。这可能会对jvm造成很大的压力,因为缓冲区不会立即释放(而且gc不能依赖于年轻一代的优化)。setPreviewCallbackWithBuffer()
重用预先分配的缓冲区,涉及gc。这也提供了一种简单的机制,只为您的后台处理器获得足够的帧。例如,如果只预先分配2个帧缓冲区,那么在发送两个帧进行处理之后,在调用addCallbackBuffer()
释放缓冲区之前,不会捕获第三个帧(也会减少复制像素的cpu使用)。
小心不要落入extra locks的陷阱:如果您提前释放缓冲区,您将承受活页夹复制实际丢弃的像素的开销。