- 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>
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/도면 저장본도 덮어쓰지 않았다.