Replies: 2 comments
1차 구현 초안2026-08-07.3.58.50.mov |
구현 업데이트 — 시간 기반 소멸로 과도한 분사를 제어한 과정초기 설계 이후 실제 메인 Hero에 Canvas 2D 기반 스프레이를 구현하고, 디자인 검수를 반복하면서 스프레이의 핵심 문제를 “얼마나 오래 남길 것인가”가 아니라 “어떤 기준으로 사라지게 할 것인가”로 재정의했습니다. 1. 최종 인터랙션 모델
즉 사용자가 긴 경로를 그려도 고정 길이의 꼬리가 뒤따르는 방식이 아니라, 먼저 뿌려진 지점부터 시간 순서대로 자연스럽게 사라지는 방식입니다. 2. 실제 구현에서 발견한 문제와 조정문제 A. 방향성 꼬리가 물줄기처럼 보임초기에는 이동 반대 방향으로 곡선 꼬리와 잔분사 입자를 추가했습니다. 그러나 스프레이는 선명한 이동 궤적보다 불규칙한 도포가 중요한 표현이라, 결과가 페인트가 흐르는 물줄기처럼 보였습니다.
문제 B. 스탬프 개수 상한이 또 다른 꼬리를 만듦동시 스탬프 수를 제한하는 방식은 성능에는 안전해 보였지만, 긴 드래그에서 가장 오래된 스탬프가 시간과 무관하게 삭제됐습니다. 이때 화면에는 항상 일정 길이의 경로만 남아 “꼬리가 잘려 따라오는” 인상을 만들었습니다.
문제 C. 필압 기반 크기 변화의 일관성Pointer Events의
3. 렌더링 구조와 성능 경계React state나 스탬프별 DOM 노드를 만들지 않고
4. 현재의 기술적 결론이 기능의 성능 안전장치는 “표현을 고정 길이로 자르는 것”이 아니라, 입력 샘플링 간격과 짧은 시간 기반 생명주기를 조합하는 데 있습니다. 그 결과 긴 경로도 시각적으로 부자연스럽게 절단되지 않으면서, 오래된 분사는 빠르게 정리돼 화면과 렌더링 비용이 과도하게 누적되지 않습니다. 5. 후속 검증 항목
관련 구현 커밋: |
Uh oh!
There was an error while loading. Please reload this page.
상태
구현 전 기술 설계 초안입니다. 디자인 자산과 색상 팔레트가 확정된 뒤 최소 동작 버전부터 구현합니다.
배경
메인 Hero의 그래피티·스프레이 시각 언어를 사용자의 입력으로 확장합니다. Hero 위에서 포인터를 누른 채 이동하면 경로를 따라 스프레이 자국이 남고, 일정 시간이 지나면 자연스럽게 사라집니다.
목표는 장식 효과를 추가하는 데 그치지 않고, 전시의 시각적 분위기에 사용자가 짧게 개입하는 경험을 만드는 것입니다.
요구사항
prefers-reduced-motion에서는 비활성화아키텍처
Hero 내부에 Canvas 2D 레이어 하나만 추가합니다. React state로 자국을 관리하거나 스탬프마다 DOM 요소를 만들지 않고, 입력 데이터와 렌더링 루프를 Canvas에서 독립적으로 처리합니다.
선택: Canvas 2D
Canvas는 다수의 반투명 스프레이 스탬프를 단일 레이어에서 그릴 수 있어 DOM 파티클 방식보다 스타일 계산·레이아웃·페인트 비용을 줄일 수 있습니다. 현 요구 범위에서는 WebGL보다 구현 복잡도가 낮고 충분한 성능을 제공합니다.
데이터 모델
각 자국은 좌표·크기·회전·브러시 종류·생성 시간만 저장합니다. 투명도는 렌더링 시 생성 시간으로 계산해 별도 애니메이션 상태를 줄입니다.
입력과 경로 보간
pointerdown에서 분사를 시작하고pointermove에서 이전 좌표와 현재 좌표의 거리를 계산합니다. 이벤트마다 무조건 자국을 생성하지 않고, 12px 간격으로 경로를 보간합니다.이 방식은 빠른 드래그에서도 공백을 줄이고, 느린 이동에서 같은 위치에 과도한 자국이 쌓이는 문제를 방지합니다.
자국 생명주기
초기 성능 예산은 다음과 같습니다.
자국은 3초 동안 유지한 뒤 1초 동안 투명해집니다. 최대 수를 넘으면 가장 오래된 자국부터 제거합니다. 살아 있는 자국이 없고 분사 중도 아닐 때는
requestAnimationFrame루프를 중지합니다.성능 고려
requestAnimationFrame당 한 번만 처리Math.min(devicePixelRatio, 2)로 제한고밀도 화면에서 DPR을 제한하지 않으면 캔버스 버퍼와 알파 합성량이 커져 GPU 메모리와 렌더링 비용이 늘어날 수 있습니다.
접근성
prefers-reduced-motion: reduce에서 비활성화pointer: coarse환경에서 비활성화aria-hidden처리검증 계획
향후 확장
All reactions