Почему следующий код имеет проблемы с производительностью, кадр с камеры не является гладким.Почему этот код имеет проблемы с производительностью даже без синхронизированного ключевого слова?
public class VideoCaptureAndroid implements PreviewCallback, Callback{
private Integer deviceRotation = Integer.MAX_VALUE;
public VideoCaptureAndroid(Context context, int id, long native_capturer) {
deviceRotationNotifier = new OrientationEventListener(context, SensorManager.SENSOR_DELAY_NORMAL) {
public void onOrientationChanged(int orientation) {
if (orientation == ORIENTATION_UNKNOWN) {
Log.d(TAG, "The device rotation angle is unknown.");
return;
}
synchronized(deviceRotation) {
if (deviceRotation != orientation) {
deviceRotation = orientation;
}
}
}
};
Exchanger<Handler> handlerExchanger = new Exchanger<Handler>();
cameraThread = new CameraThread(handlerExchanger);
cameraThread.start();
}
public synchronized void onPreviewFrame(byte[] data, Camera callbackCamera) {
int frameRotation = info.orientation;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
frameRotation = (info.orientation - deviceRotation + 360) % 360;
} else if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
frameRotation = (info.orientation + deviceRotation) % 360;
}
onFrame(data, data.length, native_capturer, frameRotation);
camera.addCallbackBuffer(data);
}
}
Похоже, что если я прокомментирую следующий код, рамка будет гладкой и проблем с производительностью. Но я не использовал synchronized
в onPreviewFrame
для доступа к deviceRotation
, почему на него будет влиять onOrientationChanged
?
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
frameRotation = (info.orientation - deviceRotation + 360) % 360;
} else if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
frameRotation = (info.orientation + deviceRotation) % 360;
}
Вы пробовали [Обзор кодов] (http://codereview.stackexchange.com/)? –
Вообще-то, я доволен. Это члены нашей команды. – ZijingWu
@JosephWood Это будет считаться не по теме для обзора кода. Читайте, что по теме, чтобы понять, почему. – syb0rg