AcroForm 관계 캐시
HotPDF는 터미널 AcroForm 필드, 정규화된 필드 이름, 위젯 주석, 위젯 서수, 페이지 위치에 걸친 문서 로컬 양방향 인덱스를 유지합니다
조회 동작
필드 인덱스와 정규화 이름 조회는 첫 빌드 이후 직접 배열과 대소문자를 구분하지 않는 open-addressed 이름 맵을 사용합니다
부모 필드는 터미널 필드가 아니어도 상속 /FT, /Ff, /Opt 항목을 제공할 수 있으며, group.a, group.b 같은 이름 있는 자식은 별개 인덱싱 필드로 남습니다
필드와 위젯이 하나의 딕셔너리를 공유하든 별도 딕셔너리를 쓰든, 이름 있는 자식 필드와 이름 없는 위젯 자식은 구분됩니다
GetLoadedFormFieldWidgetPageIndex는 위젯 서수를 페이지로 해석하고, GetLoadedFormFieldIndexForAnnotation은 페이지 주석을 필드와 위젯 서수로 되돌려 매핑합니다
주석 배열 소속이 위젯 /P 항목보다 우선이고, malformed 중복 소속에는 문서 순서의 첫 일치 페이지가 이깁니다
/AcroForm /Fields에서 빠진 위젯은 진단용 고아로 인덱싱되지만 합성 폼 필드로 노출되지는 않습니다
구축과 변경
캐시는 필드 트리 순회 한 번과 페이지 주석 순회 한 번으로 지연 구축됩니다
로드된 필드 생성은 유효한 캐시를 증분 확장하고, 필드 제거, 이름 변경, 위젯 이동, 주석 제거, 병합 등록, XFA 필드 병합, 페이지 테이블 변경은 그래프가 바뀌기 전에 캐시를 무효화합니다
다음 관계 질의는 /P 항목이 없는 위젯을 포함해 현재 객체 그래프에서 다시 빌드합니다
터미널 자식 하나를 제거하면 그 위젯과 필드 트리 항목만 제거되고, 형제 필드와 상속 설정은 유지됩니다
raw 객체 API로 AcroForm, 필드, 위젯, 페이지 /Annots, /Parent, /Kids, /P 딕셔너리를 바꾼 뒤에는 InvalidateLoadedFormRelationshipCache를 호출하십시오
성능 및 소유권
이름 맵과 객체 맵은 부하 계수를 1/2 아래로 유지해 웜 상태 조회가 예상대로 상수 시간에 끝납니다
regression 게이트는 로드된 필드 10,000개를 만들어 선형 순회 텔레메트리를 입증하고, Win32/Win64에서 반복 이름 조회가 콜드 빌드+조회보다 100배 이상 빠르도록 요구합니다
캐시는 소유권 없는 객체 포인터를 저장하며, 로드된 문서 그래프 접근은 호출자 쪽 직렬화를 유지합니다
참고: GetLoadedFormFieldWidgetPageIndex, GetLoadedFormFieldIndexForAnnotation, InvalidateLoadedFormRelationshipCache, GetLoadedFormRelationshipCacheStatistics