개발하는 리프터 꽃게맨입니다.
FlatBuffers 를 이용한 모델 로딩 최적화 본문
3D 모델을 로딩한다고 하면 일반적으로 assimp를 이용해 fbx나 obj 파일을 로딩합니다.
fbx obj 의 경우 내부 데이터가 굉장히 복잡하기 떄문에 로딩하는데 다소 시간이 걸립니다.
만약 소프트웨어에서 필요한 데이터만 로딩할 수 있따면 로딩하는 시간이 훨씬 줄어듭니다.
먼저 fbx 파일을 로딩하는데 걸리는 시간을 보겠습니다.
드래곤 모델을 로딩하는데 1.586초가 소모되었습니다.
참고로 해당 모델은 약 114000 개 가량의 버텍스와 인덱스를 가지고 있습니다.
최초에는 Josn을 이용하여 버텍스(위치, 법선, 탄젠트, 비탄젠트, uv, 노말) 과 머테리얼 속성 (PBR 및 Phong, 텍스처 경로)를 저장했는데, 커스텀 타입의 저장 및 불러오기 시간이 과하게 많이 걸렸습니다. (파일 크기도 크구요)
그래서 선택한 것이 바이너리로 데이터를 저장하는 것이었습니다.
그 과정에서 사용한 것은 구글의 FlatBuffers 라는 라이브러리입니다.
https://github.com/google/flatbuffers
GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization Library
FlatBuffers: Memory Efficient Serialization Library - google/flatbuffers
github.com
이런 식으로 데이터 스키마를 정의한 다음에
열심히 exporter와 importer를 만들어줍니다.
결과입니다.
export 는 0.124초
import 는 0.109초 걸렸습니다.
기존 방법과 비교하면
1.586 -> 0.109
14.5배 가량 빨라졌습니다.
조금 더 큰 모델을 대상으로 진행해보겠습니다.
로드하는데 6초정도 걸리는 모델을 임포트해봤는데요
이 모델을 바이너리 방식으로 변환후 입력받으면..
익스포트에 0.736초
임포트에 0.68초 걸립니다.