이 페이지는 SDK 2.0.0에 해당합니다. 메이크업 / 리셰이프 열거형: 파라미터 열거형.
올바른 프레임 유형 선택
processImage: 전에 FBImageFrame.type을 설정하세요. 엔진에 처리 모드 인자는 없습니다.
FBFrameTypeVideo(1): 카메라 미리보기, 라이브, 통화 — 더 낮은 지연.FBFrameTypeImage(0): 정지 사진 — 더 높은 품질.
큰 정지 이미지(미리보기와 내보내기)
고해상도 정지 이미지에서는 슬라이더마다 원본 픽셀을processImage:에 넣지 마세요. 축소한 뒤 원본을 버리지 마세요.
사진을 열면 전체 UIImage를 유지하고 미리보기 프레임을 한 장 만드세요(긴 변 약 1280–1440, createWithUIImage:). 파라미터 조절은 미리보기(FBFrameTypeImage)를 처리하고, 내보내기는 같은 setter로 전체 해상도를 한 번 더 처리합니다. 출력 크기는 입력과 같습니다. 카메라 미리보기는 캡처 해상도 + FBFrameTypeVideo입니다.
파라미터 범위
- 피부 / 메이크업 / 필터 강도:
[0.0, 1.0].0이면 해당 효과가 꺼집니다. - 리셰이프 (
setReshape:intensity:):[-1.0, 1.0].0은 꺼짐. 양수와 음수는 반대 방향입니다.
엔진 하나, 직렬 큐 하나
createEngineWithConfig:는 프로세스 전역 싱글톤이 아니라 인스턴스를 반환합니다. 세션당 엔진 하나를 유지하고 직렬 큐에서 호출하세요(externalContext = YES이면 GL 스레드).
메모리
- ARC를 권장합니다. 프레임이 끝나면
FBImageFrame참조를 버리세요. - 카메라 픽셀 버퍼를 재사용하세요. 캡처 형식이 이미 NV12 / BGRA이면 매 프레임 새 RGBA 버퍼를 할당하지 마세요.
- 필터와 스티커는 다음
processImage:(GL 스레드)에서 로드됩니다. 같은.fbd를 매 프레임 다시 로드하지 마세요.setFilter:/setSticker:를 한 번 호출한 뒤 필요하면setFilterIntensity:를 사용하세요. - 두 번째 엔진을 만들지 말고
clearFilter,clearSticker,clearVirtualBackground,clearChromaKey를 사용하세요.
외부 OpenGL ES
앱이 이미 GL 컨텍스트를 소유할 때:config.externalContext = YES를 설정합니다.- 해당 GL 스레드에서 엔진을 만듭니다.
createWithTexture:width:height:stride:로 텍스처를 감쌉니다.[output texture]로 출력을 읽습니다.
getStats로 모니터링
직접 만든 타이머보다 FBEngineStats를 권장합니다.
avgProcessTimeMs가 약 33 ms 이하가 되도록 하세요. 올라가면 해상도를 낮추거나, FBFrameTypeVideo로 바꾸거나, 사용하지 않는 메이크업 / 스티커를 끄세요.
라이프사이클
엔진을 뷰 컨트롤러(또는 세션 객체)의 strong 프로퍼티로 유지하세요. 세션이 끝나면dealloc에서 nil로 만드세요. viewWillDisappear / applicationDidEnterBackground에서 캡처를 일시 중지해 processImage: 호출을 멈추세요. 별도의 “pause” API는 필요 없습니다.
FBEngineCallbacks 블록에서 __weak를 사용하세요.
iOS 캡처
- 카메라 미리보기는 보통
kCVPixelFormatType_420YpCbCr8BiPlanarFullRange(NV12) 또는 BGRA입니다. CPU에서 RGBA로 변환하지 말고createWithNV12:...또는createWithBGRA:...로FBImageFrame을 만드세요. - 전면 카메라: 프레임에
setMirror:@"horizontal"(엔진 전에 픽셀을 뒤집어야 하면mirror:). - 카메라 권한:
Info.plist의NSCameraUsageDescription. 정지를 고르면NSPhotoLibraryUsageDescription.
테스트
- 테스트 앱의 Bundle ID를 바인딩하고 실제
appId/appKey또는licenseToken을 사용하세요. 더미 문자열은 라이선스 이벤트1/101로 실패합니다. - 정지(
FBFrameTypeImage+createWithUIImage:)와 라이브(FBFrameTypeVideo) 경로를 모두 커버하세요. - setter 반환 코드가
FBErrorCode_Success인지 단언하세요.

