후디니 Packed Primitive 메모리 실측: 패킹 전후 비교
Packed Primitive는 같은 geometry를 반복 복사할 때 출력 구조를 바꿉니다. Houdini 19.5.435에서 10,000 quad 원본을 10,000개 복사했을 때, Pack off 출력의 memoryusage는 8,079,947,248 B였습니다. Pack and Instance를 켜면 출력 detail 3,947,728 B와 원본 detail 846,696 B를 합해 4,794,424 B였습니다. 이 값은 SOP geometry 측정값이지 Houdini 프로세스 전체 RAM은 아닙니다.
같은 조건의 Copy to Points cook은 Pack off 5.586649초, Pack on 0.002781초였습니다. 다만 실험은 P 속성만 있는 규칙적인 Grid SOP로 했고, 뷰포트 FPS와 Karma 렌더 성능은 재지 않았습니다. 이 차이를 실제 모델이나 렌더 속도의 보장으로 읽으면 안 됩니다.
실험 조건과 측정 기준
실험은 Houdini 19.5.435의 hython에서 진행했습니다. 원본은 기본 Grid SOP의 quad grid로 10,000개 또는 100,000개 면을 만들고, target grid는 한 행에 1,000개 또는 10,000개의 점을 배치했습니다. 원본 속성은 P 하나이며 UV, 노멀, 색상, 재질은 추가하지 않았습니다.
memoryusage는 SOP geometry의 intrinsic 값입니다. Pack on 결과는 출력 detail과 참조 원본 detail을 따로 기록하고, 전체 geometry를 비교할 때는 둘을 각각 한 번씩 더했습니다. 이 합도 프로세스 RAM, 뷰포트 버퍼, GPU 메모리 또는 렌더 메모리가 아닙니다.
원본과 target SOP를 먼저 cook한 뒤 Copy to Points 또는 Unpack SOP의 cook 시간을 기록했습니다. 파일 저장 시간은 cook 시간에 포함하지 않았습니다. 표의 .bgeo.sc 크기는 실제 저장 파일의 바이트 수입니다.
10,000 quad 원본: Pack off와 Pack on
먼저 원본 크기를 10,000 quad로 고정하고 복사 점 수를 바꿨습니다. Pack on의 합계는 출력 detail과 원본 detail을 한 번씩 더한 geometry memoryusage입니다.
| 조건 | geometry memoryusage | Cook | .bgeo.sc |
|---|---|---|---|
| 10,000 quad × 1,000 · Pack off | 808,023,336 B | 0.490583 s | 5,452,374 B |
| 10,000 quad × 1,000 · Pack on | 출력 405,096 + 원본 846,696 = 1,251,792 B | 0.000477 s | 27,531 B |
| 10,000 quad × 10,000 · Pack off | 8,079,947,248 B | 5.586649 s | 42,541,907 B |
| 10,000 quad × 10,000 · Pack on | 출력 3,947,728 + 원본 846,696 = 4,794,424 B | 0.002781 s | 51,028 B |
1,000개 복사에서 Pack off의 출력은 808,023,336 B, 약 770.59 MiB였습니다. Pack on은 출력 405,096 B에 공유 원본 846,696 B를 더해 약 1.19 MiB였습니다. 10,000개 복사에서는 Pack off가 8,079,947,248 B였고, 저장 후 ginfo로 읽은 geometry는 7.53 GiB였습니다.
이 실험은 같은 원본을 반복 복사할 때 참조 방식이 출력 geometry를 작게 유지하는 모습을 보여줍니다. 하지만 .bgeo.sc 파일도 규칙 격자 형태의 압축 영향을 크게 받습니다. 실제 모델에 UV, 노멀, 재질, 그룹 등 속성이 있으면 이 파일 크기나 압축 비율을 그대로 기대할 수 없습니다.
원본이 100,000 quad일 때
원본을 100,000 quad로 늘린 조건은 Pack on만 측정했습니다. Pack off 결과는 만들지 않았으므로 두 모드의 직접 비교로 해석하지 마세요.
| 조건 | geometry memoryusage | Cook | .bgeo.sc |
|---|---|---|---|
| 100,000 quad × 1,000 · Pack on | 출력 405,096 + 원본 8,098,552 = 8,503,648 B | 0.000535 s | 277,580 B |
| 100,000 quad × 10,000 · Pack on | 출력 3,947,728 + 원본 8,098,552 = 12,046,280 B | 0.005737 s | 296,518 B |
출력 detail 값은 10,000 quad 원본의 Pack on 결과와 복사 점 수별로 같았고, 원본 detail은 8,098,552 B로 커졌습니다. 이 구분이 중요합니다. Packed Primitive가 원본 geometry를 없애는 것이 아니라 공유하기 때문입니다.

Pack을 Unpack하면 다시 커질까?
10,000 quad 원본을 1,000개 복사한 Pack on 결과 뒤에 Unpack SOP를 연결했습니다. 저장 후 File SOP로 다시 읽은 geometry의 memoryusage와 point·primitive 수는 Pack off와 같았고, 저장 파일도 5,452,374 B로 같았습니다.
| 단계 | geometry memoryusage | Cook | .bgeo.sc |
|---|---|---|---|
| Pack off | 808,023,336 B | 0.490583 s | 5,452,374 B |
| Pack on | 출력 405,096 + 원본 846,696 B | 0.000477 s | 27,531 B |
| Pack → Unpack, 즉시 SOP 출력 | 2,002,878,504 B | Copy + Unpack 합계 3.685101 s | 5,452,374 B |
| Unpack 저장 후 File SOP readback | 808,023,336 B | 별도 cook 시간 미측정 | 5,452,374 B |
즉시 Unpack SOP 출력과 저장 후 readback의 memoryusage는 달랐습니다. 왜 차이가 났는지는 이번 실험만으로 확정하지 않습니다. 둘 다 geometry intrinsic 값이며 프로세스 RAM을 뜻하지 않으므로, 측정 시점이 다른 값을 같은 숫자처럼 비교하지 마세요.
10,000 quad × 10,000 복사의 Pack → Unpack은 300초 제한 동안 저장 결과 파일이 생성되지 않았습니다. 따라서 이 조건의 최종 메모리와 파일 크기는 표에 없습니다. 실측 범위는 10,000 quad의 Pack off/on 비교와 100,000 quad의 Pack on뿐입니다. 100,000 quad × 10,000점을 geometry로 펼치면 polygon 1,000,000,000개가 됩니다. 이 조건은 측정 대상에 넣지 않았으며, Pack off와 Unpack 수치는 제공하지 않습니다.
Packed Primitive는 압축이 아니라 참조 구조
in-memory Packed Primitive는 원본 geometry를 메모리에 둔 채 여러 복사본이 같은 데이터를 참조하는 방식입니다. 복사본마다 점과 면 전체를 반복해서 만들지 않고, 원본 하나와 인스턴스별 참조 및 transform을 사용합니다. 따라서 Pack은 geometry를 압축하는 기능이 아닙니다.
이번 10,000 quad × 1,000 Pack on 결과에서 첫 packed primitive의 typename은 PackedGeometry, primitive memoryusage는 376 B였습니다. 이는 첫 primitive의 intrinsic 값입니다. 출력 전체나 세션 RAM으로 해석하지 않습니다.
| 유형 | 무엇을 참조하나 | 사용 시 확인할 점 |
|---|---|---|
| In-memory Packed Primitive | 메모리에 있는 원본 geometry | 반복 복사에 적합한 참조 방식. 편집할 geometry가 필요하면 Unpack을 검토 |
| Packed Disk Primitive | 디스크의 geometry 파일 | 메모리 원본 대신 파일을 참조. 파일 경로와 실제 로드 비용을 확인 |
| Packed Fragment | name 값에 대응하는 원본 geometry 일부 | 조각별 변환에 유용. 일부 조각을 지워도 원본 전체가 메모리에 남을 수 있음 |
Packed Disk Primitive는 파일 참조이고 in-memory Packed Primitive는 메모리에 있는 geometry 참조라는 차이가 있습니다. 이번 실험은 Packed Disk의 로드 비용이나 메모리를 별도로 측정하지 않았습니다. 후디니 캐시 형식별 용량 실측에서 파일 크기와 캐시 형식도 함께 비교할 수 있습니다.
뷰포트 속도와 Karma 렌더는 따로 확인
packed copy는 동일한 geometry를 여러 transform으로 그릴 수 있어 뷰포트 표시 효율에 도움이 될 수 있습니다. 하지만 이번 측정은 SOP cook 시간이며 뷰포트 FPS는 재지 않았습니다. cook이 빨라진 만큼 화면도 빨라진다고 단정할 수 없습니다.
Karma도 별도 경로입니다. Houdini 19.5의 packed geometry 렌더링 설명은 Mantra/IFD 기준입니다. 이 내용을 Karma의 속도나 메모리 근거로 옮기지 마세요. Karma는 USD/Hydra를 사용하므로 SOP packed 상태뿐 아니라 USD로 가져올 때 만들어진 인스턴스 표현도 확인해야 합니다.
버전 차이도 주의하세요. Houdini 19.5의 SOP Import 문서에도 packed SOP를 USD native instance 또는 point instancer로 가져오는 기능이 나옵니다. Houdini 22의 현재 문서는 설정명을 Create Native Instances, Create PointInstancer로 구분합니다. 따라서 그 기능이 19.5에는 없었다고 쓰면 안 되고, 이번 실험도 Karma 성능을 측정한 것으로 볼 수 없습니다.
Copy to Points의 orient, N, up, pscale에 따른 배치 결과는 메모리 문제와 분리해 확인하세요. 관련 내용은 Copy to Points 속성 우선순위와 복사 방향에서 볼 수 있습니다.
Packed Primitive 메모리 추정기
아래 계산기는 이 글의 규칙적인 Grid SOP 측정값으로 geometry memoryusage를 근사합니다. 기본 입력인 10,000 quad × 1,000 복사는 Pack off 약 770.59 MiB, Pack on 출력과 원본 합계 약 1.19 MiB로 표시됩니다. 실제 모델, 프로세스 RAM, viewport 또는 Karma 성능 예측기는 아닙니다.
원본 detail은 10,000·100,000 quad 측정값 사이, Pack on 출력 detail은 1,000·10,000 복사 측정값 사이를 선형 보간합니다. Pack off 식은 10,000 quad 원본의 1,000·10,000개 복사 측정값에 맞췄습니다. Pack 후 Unpack은 10,000 quad × 1,000 복사만 저장 후 readback을 확인했고, 같은 조건의 Pack off와 geometry memoryusage 및 파일 크기가 같았습니다. 계산기의 Unpack 값은 Pack off와 같은 저장 geometry footprint를 가정한 추정치이며, 10,000 quad × 10,000 복사의 Unpack은 미측정입니다. 원본은 40,934.222 + 80.576178 × quad, Pack off 및 Unpack 추정은 31,790.222 + 80.799155 × quad × 복사 수, Pack on 출력 detail은 11,470.222 + 393.625778 × 복사 수 bytes입니다. 다른 원본 크기의 Pack off/Unpack은 외삽 경고를 표시하며, 100,000 quad × 10,000 복사의 Pack off/Unpack은 계산기에서 수치를 표시하지 않습니다.
원본 quad 수와 복사 개수를 넣어, 이 글의 Houdini 19.5.435 측정 비율로 geometry memoryusage를 대략 계산합니다.
규칙적인 Grid SOP와 P 속성만으로 잰 추정치입니다. 실제 모델의 속성·토폴로지·렌더러 메모리나 프로세스 RAM을 예측하지 않습니다.
정리: Pack은 원본을 공유한다
같은 원본을 여러 번 복사할 때 Packed Primitive는 복사본마다 전체 geometry를 만들지 않고 원본을 공유합니다. 실험한 Grid SOP에서는 Pack on의 geometry intrinsic과 cook 시간이 크게 줄었습니다. 이는 이 조건에서 관측한 결과이지 모든 모델에 적용되는 절감률은 아닙니다.
실제 작업에서는 원본과 출력 detail을 나눠 보고, Unpack 이후에 geometry가 다시 전개되는 시점도 확인하세요. 뷰포트 FPS와 Karma 결과는 별도로 측정해야 합니다. Packed Primitive는 압축 파일이 아니라 원본 공유를 위한 참조 구조라는 점이 적용 여부를 판단하는 출발점입니다.
SideFX 공식 문서
vfx 잡학지식

댓글 0
첫 댓글을 남겨보세요.