렌더링 · 사전 가시성

미리 구한 풍경이
사라지는 순간

미리 저장한 목록은 바뀐 카메라까지 알고 있을까요?
지금 필요한 대상—
제출한 대상—
화면에서 누락—

● 현재 보이며 제출됨× 필요하지만 누락○ 현재 불필요한 제출● 미제출

구간 —

문제 · 원인 · 해결 · 대가

경로를 제한하면,
미래의 화면을 저장할 수 있습니다.

문제 · 문 뒤의 풍경이 빠졌어요

‘문이 열린 뒤’를 눌러 보세요. 주황색 ×는 지금 카메라에 필요하지만 닫힌 문을 기준으로 만든 목록에는 없는 대상입니다. 관찰도에 남아 있는 회색 대상도 월드에서 삭제된 것은 아닙니다.

원인 · 저장한 조건과 달라졌기 때문

카메라 경로를 구간으로 나누고, 각 구간의 여러 시점에서 보인 대상의 합집합 Bᵢ를 저장합니다. 안전하려면 구간 내 모든 위치의 V(s)가 Bᵢ에 들어가야 합니다. ‘끝점만 저장’에서는 양 끝에서 안 보인 대상이 구간 중간에 나타납니다. 유한 표본만으로 연속 구간 전체를 보장할 수 없습니다.

해결 · 상태를 준비하거나 현재 시점을 검사

열린 문 목록을 함께 저장하면 문 상태에 맞는 목록을 고를 수 있습니다. 인접 목록의 합집합은 제출 범위를 늘려 경계의 누락을 줄이지만, 원래 목록에 없던 문 뒤 대상까지 만들지는 못합니다. 카메라 이탈과 시야각 확대는 별도 조건입니다. ‘현재 시점 재계산’은 이 장면의 현재 가시 집합을 직접 구합니다. 되돌아가도 같은 진행률과 상태는 같은 목록을 선택합니다.

대가 · 제출량, 제작 작업, 저장량

‘전체 대상 제출’은 모든 36개 장식 대상을 보냅니다. 사전 목록은 실행 시 가시성 검사를 줄이는 대신 제작 때 표본을 검사하고 구간별 목록을 저장합니다. 구간·상태가 늘면 비트셋 저장량과 표본 검사 횟수가 늘어납니다. 제출된 대상은 여전히 그리는 작업이 필요합니다.

이 장면의 계산 범위

대상 중심점 36개와 선분 가림막을 사용한 2D 모델입니다. 아래 화면은 점의 시야각·거리를 정규화해 보여주며 실제 원근 렌더러가 아닙니다. 문과 가림막은 별도 표시하고 제출 개수에는 장식 대상만 셉니다. 비트셋 환산 저장량은 구간당 36비트를 바이트 단위로 올린 5B입니다. 실제 JavaScript Set의 메모리가 아니며 자료구조 부가 비용은 제외합니다. 제작 시간은 이 브라우저의 표본 목록 생성 시간입니다. 비교용 현재 가시성 검사 비용은 선택 방식의 검사 수와 구분합니다. 원작의 압축·정렬·동적 객체 알고리즘이나 실기 성능을 재현하지 않습니다.

개발자 회고 · Andy Gavin, Making Crash Bandicoot – part 3 ↗