현재 위치 - 중국 분류 정보 발표 플랫폼 - 생활 서비스 정보 - 빈번한 createBitmap으로 인한 OOM 문제 기록

빈번한 createBitmap으로 인한 OOM 문제 기록

현재 카메라 관련 애플리케이션을 작업 중입니다. 일반적으로 카메라 출력을 회전해야 카메라 센서의 좌표계가 일치하지 않기 때문입니다. 네, 자세한 내용은 다루지 않겠습니다. 그러나 이미지 출력으로 인해 발생하는 일련의 문제는 기록할 가치가 있습니다.

우선 이미지 미리보기 출력이 매우 느리고 멈춤 현상이 발생하므로 주의해야 합니다. ImageReader의 출력 형식으로 ImageFormat.JPEG를 사용하지 마십시오. 그 이유는 카메라가 JPEG 형식으로 출력하는 경우 여전히 트랜스코딩을 수행해야 하기 때문인 것 같습니다. 이는 저성능 휴대폰에서 쉽게 지연을 일으킬 수 있습니다. 형식을 변경한 후에도 형식이 계속 지속된다면 해상도를 낮추는 것이 좋습니다. 이미지 출력. YUV를 비트맵으로 변환하는 경우 JPEG를 비트맵으로 직접 출력하는 것보다 성능이 더 높은 온라인 C 라이브러리를 찾을 수 있습니다.

다음 단계는 이미지의 방향이 화면과 일치하지 않는다는 것입니다. 회전하는 비트맵을 온라인에서 검색할 때 기본적으로

를 사용하여 새 비트맵을 만든 다음 출시한다고 합니다. 이때 함정이 옵니다. 평소에는 이렇게 사용하면 괜찮지만, 이 경우 카메라 미리보기 출력 속도가 너무 빨라서 문제가 발생합니다. 비트맵은 이를 해제할 시간이 없으며 마침내 메모리 오버플로가 발생할 때까지 메모리 누수가 천천히 발생합니다. 게다가 비트맵 생성은 메모리를 많이 소모하는데, 비트맵을 자주 생성할 경우 메모리 소모가 매우 빠릅니다. 이때 비트맵을 회전시키는 방법은 인터넷에서 거의 언급되지 않는 방법입니다. 캔버스를 사용하세요.

이때 Canvas에 있는 모든 그림은 Bitmap에 직접 그려지는데 Canvas에도 drawBitmap 메소드가 있고 다른 Bitmap을 그대로 사용할 수 있다는 것을 알고 있습니다. 더 중요한 것은 drawBitmap의 오버로드된 메서드 중 하나가 Matrix를 전달할 수 있다는 점인데, 이때 솔루션이 나오는데, 전역적으로 재사용되는 Bitmap을 생성하고 회전된 크기에 주의를 기울인 다음 이를 사용하여 Canvas를 생성할 수 있습니다. 그런 다음 모든 비트맵 회전에서는 새 비트맵을 생성할 필요가 없으며, canvas.drawBitmap을 사용하여 전역 비트맵에 그리기만 하면 됩니다. 하지만 아직 끝나지 않았습니다.

Bitmap을 통해 생성된 Canvas의 크기는 Bitmap의 크기와 동일하며, Matrix를 회전시키면 Brush의 Bitmap 위치가 변경된다는 점에 주의해야 합니다. 최종 도면은 비트맵에 출력될 수 있으며, 비트맵에는 작은 부분만 그려질 수도 있고 전혀 그려지지 않을 수도 있습니다. 이때 브러시 출력 위치를 캔버스와 일관되게 유지하기 위해 매트릭스에 변위 작업을 추가해야 합니다. 선 생성을 잊어버렸기 때문에 구체적인 변위 거리를 직접 계산해야 하므로 두 가지 방법을 사용합니다. 종이를 직접 돌려서 위치를 확인해 보세요..

이때 카메라 영상 출력으로 발생하는 문제는 이 몇 단계만 썼을 뿐인데 막히더군요. 인터넷에서 관련 문제 기록을 찾을 수 없어서 반나절이 걸려서 잊어버리지 않도록 기록했습니다.

——libyuv 라이브러리를 사용하여 YUV를 Bitmap으로 변환할 수 있으며, 회전 작업도 이 라이브러리를 통해 완료할 수 있으므로 회전에는 Java를 사용하지 않는 것이 가장 좋습니다.