손목 센싱 성능 분석과 개선 기록
2026-09-13. 소스·로컬 자산 및 Node.js CPU 측정 기준. 실제 브라우저 FPS, GPU 시간, 네트워크 로딩 시간은 측정하지 않았다.
결론
손목 실험용 전신 아바타를 별도 경량 자산으로 만들면 초기 로딩과 렌더링 부담을 줄일 수 있다. 현재는 기존 전신 트윈의 전체 해부학 자산을 그대로 불러온다. 단순히 불필요한 계통을 숨기는 방식은 다운로드·디코딩·메모리 부담을 제거하지 못한다.
| 항목 | 로컬 파일/기하 측정 | 의미 |
|---|---|---|
| 전신 GLB 6개 | 11.40 MiB, 2,610,679 삼각형 | 작은 자세 미리보기에 전체 해부학을 사용한다. |
| 손목 GLB | 5.37 MiB | 전신과 별도로 로드한다. |
| 공유 3D bridge JS | 약 3.04 MiB, 비압축 파일 | 전신 엔진·모션·피부 단면 코드와 Three를 포함한다. |
| 손목 자체 Three 모듈 | 0.55 MiB + 의존 core | 공유 bridge에도 별도 Three가 포함되어 있다. |
원본 전신 파일의 primitive 수 2,338은 실제 draw call 수가 아니다. 전신 로더에서 기하를 병합한다. 다중 반투명 계통의 겹침은 GPU 픽셀 처리량을 늘리므로 삼각형 수만으로 FPS를 계산할 수 없다.
초기 최적화 직후의 과거 Node.js 단일 실행 참고값: 손목 GLB 파싱·초기화 약 132 ms, 120회 평균 손목 조직 CPU 갱신 약 0.42 ms/회, 9채널 기본 신호 모델은 16 ms 시뮬레이션 구간당 CPU 약 1.07 ms. 이후 원본 요골동맥 경로 복원·굽힘 구간 분할·회전 조작 변경을 포함한 현재 버전에서는 이 시간을 다시 측정하지 않았다. 이는 GPU·렌더링·브라우저 작업·WASM 분석을 제외한 값이며 기기와 설정에 따라 달라진다. 현재 성능이나 화면 렌더링 병목이 확정됐다는 근거로 사용하지 않는다.
적용된 최적화
- 화면 밖 또는 접힌 전신·손목 3D는 갱신하지 않는다. 신호 worker 시간축은 계속 유지한다.
- 조직 단면/등고선 모드에서는 숨겨진 손목 해부학 메시와 패치를 매 프레임 변형하지 않는다.
- 손목 피부의 둘레 정보를 초기화 때 계산한다. 패치를 이동·회전하면 위치와 단위 맥동 변위를 캐시하고, 매 프레임에는 작은 변위만 더한다. 수많은 피부 raycast를 반복하지 않는다.
- 손목 렌더러의 최대 픽셀 비율을 2에서 1.5로 제한한다. 같은 CSS 크기에서 최대 렌더 픽셀 수는 43.75% 감소한다. 실제 속도 향상률과는 다르다.
- 패치 레이아웃 교체 시 이전 geometry·material·숫자 texture를 해제한다.
- GLB의 interleaved 위치/법선 데이터를 독립 배열로 분리해 변형이 법선을 덮어쓰던 오류를 수정했다.
다음 최적화 우선순위
- 손목 센싱용 별도 저해상도 전신 GLB: 피부 외형과 움직임 인지에 필요한 뼈/우측 팔·주요 혈관만 보존한다. 걷기 모션은 전신과 동일한 HumanRig와 캡처 데이터를 사용한다. 로딩 단계에서 불필요한 장기·세부 신경 GLB를 요청하지 않도록 로더도 분리해야 한다.
- 전신 상세 모델 선택 로드: 사용자가 전체 해부학을 요구할 때만 원본 계통을 가져온다. 손목 정밀 모델은 유지한다.
- Three 공유 및 bridge 분리: 두 렌더러의 라이브러리를 통합하고 전신/단면 모듈을 필요할 때 로드한다.
- 실제 기기 프로파일: 초기 다운로드·디코딩·리깅·shader compile, CPU/GPU frame time, 반투명 overdraw를 분리 측정한다. 그 결과로 LOD와 해상도를 정한다.
위 1–4의 별도 경량 전신 자산 제작 및 실제 브라우저 프로파일은 이번 변경에 포함하지 않았다.
기능 변경과 모델 한계
전신·손목 보행은 동일한 캡처와 보행 주기(1.1166667초)를 사용한다. 패치는 피부 둘레의 호 길이를 따라 감기며 ,/.로 2.5°씩 회전한다. 회전한 전극의 좌표는 신호 생성 모델에도 전달된다. 중앙 빈 공간 또는 Option(Alt)+좌우 드래그는 혈관 길이축(원본 X, 조직 단면 Z)을 중심으로 손목을 굴리는 회전이다. 상단에서 오른쪽 드래그는 시계 방향, 하단에서 오른쪽 드래그는 반시계 방향 화면 회전이다(왼쪽 드래그는 반대). 상단·하단에서 위아래 드래그하면 현재 화면 수평축을 중심으로 기울어진다. 좌우 가장자리에서는 화면상 물체가 드래그 방향을 따른다. 중앙 동맥축 회전도 현재 투영 방향에 맞춰 부호를 결정한다. 초기화 아이콘으로 표시 옵션·혈관·패치·카메라를 기본값으로 복원한다. 손목 3D 영상은 화면 폭을 따르는 1:1 영역이며 아래 옵션은 별도 높이를 사용한다. 상단 소개 패널을 제거하고 실험 요약 카드는 접기·펼치기를 제공한다.
요골동맥은 짧은 별도 관을 제거하고 손바닥 동맥궁까지 이어지는 원본 아틀라스 경로를 복원했다. 양 끝을 고정하고 중간 위치 조절량을 5차 완화 함수로 연결한다. 연결된 동맥들은 같은 공간 변형장을 공유하며, 휘는 구간만 추가 분할하고 표면 법선을 보정한다. 조직 변위 계산의 반경 1.1 mm는 대표값이며 원본 혈관의 개인별 직경을 피팅한 값은 아니다. 공간 변형은 탄성 거동을 표현하는 근사이며 물성 기반 FEM이나 혈류 재해석은 아니다. 좌우·깊이 조절량은 신호 생성, 3D 혈관·주변 조직 및 절단면에 연결된다. 압력에 따른 기존 인과적 반경 변화가 혈관의 팽창·수축을 구동한다.
피부 둘레는 실제 메시 단면을 3 mm 간격으로 표본화한 근사이고, 그 데이터는 3D·전극 위치·스냅샷이 공유한다. 전극의 피부 표면 높이를 국소 혈관 깊이 계산에도 반영한다. 패드 신호의 공간 전달 함수는 기존 국소 조직 근사이며 손목의 모든 둘레에서 환자별 접촉·심부 해부학·FEM 정확도를 검증한 모델은 아니다. 패치 순응도 설정은 기존 센서 결합 모델에 유지되며 표시 패치는 유연한 패치 형태를 보여준다.
스냅샷의 흰 동맥 선은 기존 고정 lateral 기준값을 제거하고 실제 아틀라스 중심선을 피부 둘레의 호 길이로 변환한 뒤 패치 회전을 역변환해 표시한다. 2D heatmap·등고선·지연 지도 및 3D 막대·표면 보기에서 동일한 경로를 사용한다. 기존 빔 탐색의 노란 추정선은 추정 결과이며, 회전된 배열에 대한 역모델 검증은 별도 과제로 남는다.