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); 
    } 

    } 

다음 코드를 주석 처리하면 프레임이 부드럽고 성능 문제가없는 것처럼 보입니다. 하지만 onPreviewFramesynchronized을 사용하지 않았기 때문에 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

당신이 표시 한 코드는 하지 문제 가능성이 높습니다. 모듈러스 연산은 느리지 만 각 프레임을 하나씩 수행하는 것은 큰 영향을 미치지 않습니다. frameRotation 값은 onFrame()으로 전달되는데 여기에서는 데이터를 회전하기 위해 행렬 또는 다른 변환을 적용하는 것으로 가정합니다. 이것은 값 비싼 연산이며 힙을 사용하고 느린 하나 이상의 임시 버퍼 (또는 Bitmap 개체)를 사용하는 것과 관련이 있습니다. info.orientation이 변경되지 않고 onFrame()으로 전달된다고 가정하면 프레임을 조정할 필요가 없습니다. 따라서 표시된 두 줄을 제거하면 onFrame()에 과도한 처리가 발생하지 않으므로 지터가 사라집니다.

traceview 또는 systrace를 사용하여 확인하는 것이 좋습니다.