2016-07-11 1 views
0

Почему следующий код имеет проблемы с производительностью, кадр с камеры не является гладким.Почему этот код имеет проблемы с производительностью даже без синхронизированного ключевого слова?

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; 
} 
+0

Вы пробовали [Обзор кодов] (http://codereview.stackexchange.com/)? –

+0

Вообще-то, я доволен. Это члены нашей команды. – ZijingWu

+0

@JosephWood Это будет считаться не по теме для обзора кода. Читайте, что по теме, чтобы понять, почему. – syb0rg

ответ

0

код, который Вы указали, скорее всего, не проблема. Операции Modulo выполняются медленно, но при этом каждый отдельный кадр не будет иметь большого эффекта. Значение frameRotation передается в onFrame(), который мы можем только предположить, применяя матрицу или другое преобразование для поворота данных. Это дорогостоящая операция и, скорее всего, связано с использованием одного или нескольких временных буферов (или Bitmap объектов), который использует кучу, а также медленный. Я предполагаю, что info.orientation, пройденный без изменений до onFrame(), не приведет к корректировке кадра. Следовательно, удаление двух указанных вами строк приведет к отсутствию тяжелой обработки в onFrame(), поэтому джиттер исчезает.

Вы можете отслеживать это лучше, используя traceview или systrace для подтверждения.

Смежные вопросы