Files
Pier_v1/RAG/design-model-box-sample_2/docs/VIEWER_PERFORMANCE_20260914.md
T
ahnyongjooandClaude Sonnet 5.5 964a841de1 chore(rebar): Pier_T_rebar 작업 폴더 초기 구성 및 외부 의존 파일 통합
- Code\rebar_pipeline, review_pipeline, pier-program을 정션에서 실제 폴더로 전환
- Code\rhino_mcp 및 CLAUDE_rhino배경.md 추가, .mcp.json은 PYTHONPATH로 새 위치 사용
- pier-program 내부 .git 제거(이력은 backup\pier-program_20261028.bundle에 보관)
- worktree 가이드 반영(CLAUDE.local.md, HANDOFF.md)
- D:\Rhino-MCP 경로 참조를 새 위치로 치환

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:20:18 +09:00

4.5 KiB

대형 철근 모델 뷰어 개선

후속 개선: WebGL2 철근 표시

첫 Canvas 2D 최적화 이후에도 사용자에게 무겁다는 피드백이 있어, 철근 표시를 WebGL2 인스턴싱으로 전환했다.

  • 원호를 포함한 모든 선분을 유지한 채 GPU 버퍼에 한 번 업로드한다. 카메라 이동 중에는 버퍼를 다시 올리지 않는다.
  • 테두리/본체 두 번의 instanced draw로 표시한다. 직경은 픽셀 투영으로 반영하며 물리 모델·OBJ·보고서 경로는 바꾸지 않는다.
  • 큰 전역 좌표는 모델 원점에 대한 상대 좌표로 GPU에 전달한다. 화면용 float 정밀도와 원본 double 좌표를 구분한다.
  • WebGL2를 사용할 수 없거나 context가 끊기면 기존 Canvas 2D 표시로 돌아간다. context 소실 때도 즉시 재표시를 요청한다.
  • 보고서/JSON 캡처 시 콘크리트 Canvas와 GPU 철근층을 합성한다. 카메라 조작 중에는 이미지 readback을 하지 않는다.
  • 현재 프레임 대체 타이머는 16ms다. 아래 50ms는 첫 최적화 당시 기록이다.

5개 모델에서 GPU 표시를 확인했다. f37은 GPU에 전달한 선분 수와 원본 표시 선분 수 모두 151,539개, 2120은 259,842개이며 조작 중 재업로드 없이 유지됐다. 가열 후 c37 JS 1.52.1ms, 03dd JS 1.72.1ms를 관측했다. gl.finish()로 GPU 완료를 기다린 측정에서는 c37 입력→완료 5~17ms, f37 32ms, 2120 35ms, dc0 57ms 표본을 확인했다. 초기 프레임·자동 갱신·브라우저 스케줄링에 따른 변동은 있으며, 이 수치는 모든 PC의 FPS 보장이 아니다.

관련 로컬 unittest 19건 통과. 실제 context 소실 시 Canvas 2D 전환과 선분 수 보존을 확인했고, 보고서 캡처 PNG에 GPU 철근이 포함됨을 픽셀 검사로 확인했다. 추가 라이브러리나 외부 CDN을 도입하지 않았다.

변경

  • 카메라 이동 중 콘크리트/굽힘 철근 계산과 상태 목록을 재사용한다. 모델 변경·필터·각도 선택 등 일반 그리기는 다시 계산한다.
  • 좌표와 경계 계산에 점 인덱스 및 재사용 Float64 배열을 사용한다. 카메라 회전이 같으면 투영 중간값도 재사용한다.
  • 확대·축소·이동 입력을 최신 카메라 상태의 한 프레임으로 합친다. 가시 탭에서도 RAF가 지연되는 환경에는 50ms 타이머를 대체 트리거로 사용하며 중복 프레임은 취소한다.
  • 모든 선분을 개별 stroke로 그리는 대신 Path2D로 묶는다. 같은 철근의 원호 선분은 연속 경로로 그려 불필요한 선단 렌더링을 줄인다.
  • 화면 밖으로 완전히 벗어난 선분만 표시 과정에서 제외한다. 이동하면 다시 표시한다. OBJ·보고서·물리 모델에서는 제외하지 않는다.
  • 화면용 선 굵기만 0.25 CSS px 단위로 묶는다(최대 차이 0.125px). 실제 철근 직경·원호·좌표는 바꾸지 않는다.
  • 드래그/카메라 조작 중과 비활성 페이지에서는 저장 작업 자동 조회를 미룬다. 다음 유휴 조회에서 변경 모델을 반영한다.

측정과 확인

03dd 전체 모델(167,536선분)에서 이전 동기식 휠 처리 502/1,315/1,362ms를 측정했다. 변경 후 캐시 사용 프레임의 JS 처리 시간은 약 2462ms였다. 다른 모델의 단일 확대 프레임은 f37 33.5ms, 2120 37.0ms, dc0 37.3ms, c37 46.5ms였다. 이는 해당 브라우저에서의 JS 시간이며 GPU 완료 시간이나 보장 FPS가 아니다. 테스트 브라우저는 아무 작업이 없는 RAF도 약 1초 지연되는 현상이 있었다. 타이머 대체 후 관측된 입력→그리기 완료는 대체로 6192ms였지만 777ms 지연 표본도 있었다. 따라서 모든 기기의 끊김 제거를 보장하지 않는다.

  • 12개 연속 휠 입력: 새 프레임 1회, 철근 재계산 0회.
  • 객체 선택 변경: 재계산 1회, 전체 선택 복귀 시 167,536선분 복원.
  • 5개 모델의 개선 전후 콘크리트 및 철근 좌표·소속·굽힘 정보가 정확히 일치.
  • 새 투영식과 기존 투영식의 좌표/화면 맞춤 일치, 원호 선분 보존, 화면 밖 제외/복원, 별개 철근 경로 비연결 검사 통과.
  • 관련 로컬 unittest 18건 통과. 이번 변경에서 전체 백엔드 회귀검사는 재실행하지 않음.
  • 실제 8097에서 5개 모델 로드 및 캐시 사용 프레임 확인. 콘솔 오류 0건.

기존 생성·배근·OBJ·보고서 계산은 변경하지 않았고 작업 JSON/도면 저장본도 덮어쓰지 않았다.