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