FrameType 선택
processImage 전에 ImageFrame.type을 설정하세요. 추가 모드 인자는 없습니다.
FrameType.VIDEO (기본값)
- 카메라 미리보기, 영상 통화, 라이브 스트리밍
- 더 낮은 지연
FrameType.IMAGE
- 갤러리 사진, 내보내기, 정지 캡처
- 더 높은 품질, 프레임당 비용이 더 큼
큰 정지 이미지(미리보기와 내보내기)
고해상도 정지 이미지에서는 슬라이더마다 원본 픽셀을processImage에 넣지 마세요. 축소한 뒤 원본을 버리지 마세요.
사진을 열면 전체 Bitmap을 유지하고 미리보기 프레임을 한 장 만드세요(긴 변 약 1280–1440). 파라미터 조절은 미리보기(FrameType.IMAGE)에 processImage하고, 내보내기는 같은 setter로 전체 해상도를 한 번 더 처리합니다. 출력 크기는 입력 프레임과 같습니다. 미리보기를 확대해서 내보내기로 쓰지 마세요. 카메라 미리보기는 캡처 해상도 + FrameType.VIDEO입니다.
파라미터 범위
낮게 시작한 뒤 얼굴 검출과 FPS를 확인한 다음 올리세요.
라이브 미리보기 (예시):
setBeautySkinOnly(true)를 켜세요.
프리셋 이름: 파라미터 열거형.
메모리
픽셀 데이터로 프레임을 만들 때는 directByteBuffer를 사용하세요.
- 프로세스 / GL 컨텍스트당 엔진 하나. 프레임마다 만들지 마세요
- 대화형 정지: 미리보기용 복사본을 스케일하고, 내보내기용 원본
Bitmap을 유지하세요. 큰 정지 이미지를 보세요 convert()는 새 프레임을 할당합니다. 해제하세요
OpenGL ES
externalContext = true일 때:
- 현재 컨텍스트가 있는 GL 스레드에서 엔진을 생성하세요
- 입력 텍스처,
processImage, 출력 텍스처를 같은 컨텍스트에 유지하세요 - 컨텍스트 손실 후 엔진을 다시 만드세요
- GPU에 남을 때는 CPU 다운로드가 아니라
output.getTexture()로 결과를 읽으세요
엔진 하나, application context
단일BeautyEffectEngine을 유지하세요. Activity보다 오래 살도록 getApplicationContext()를 쓰고, 세션이 끝나면 여전히 release()하세요.
UI 스레드 밖에서
processImage는 카메라 / GL / 전용 스레드에서 실행하세요. UI용으로만 결과를 메인 looper에 post하세요.
ImageFrame을 공유하지 마세요. 데모 카메라 경로는 렌더 스레드에서 최신 프레임을 처리합니다.
assets에서 필터와 스티커
.fbd 파일을 assets/에 두고 byte[]를 전달하세요(또는 filesDir에 복사한 뒤 경로를 전달). 사용자가 효과를 고를 때 setFilter / setSticker를 한 번 호출하고, 매 프레임마다 호출하지 마세요. 믹스는 setFilterIntensity로 조절하세요.
GPU 업로드는 다음 processImage에서 이루어집니다.
getStats로 모니터링
avgProcessTimeMs가 약 33 ms를 계속 넘으면 해상도를 낮추거나, FrameType.VIDEO를 사용하거나, 동시 리셰이프 / 메이크업 / VB를 줄이세요.
사용자 슬라이더 유지
강도는 직접 저장하세요(SharedPreferences). 엔진이 만들어진 뒤 setSmoothing, setReshape, setLipstick, …으로 다시 적용하세요. SDK는 UI 상태를 유지하지 않습니다.
라이프사이클
onResume/onPause: 카메라를 시작하고 중지합니다. 곧 재개할 거면 엔진을 유지하세요onDestroy/onDetach: 이 소유자가 만들었다면engine.release()externalContext: GL 스레드에서 생성 / 파괴
테스트
licenseToken, 또는 도달 가능한 /facebetter/v2/auth와 바인딩된 패키지 이름).
