v1.2.0-ko.7
1.2.0-ko.7April 20, 2026
요약
TXT 파일 읽기 경험을 두 가지 축에서 크게 개선합니다:
- 파일 크기 무관 즉시 열기 — 이전에는 첫 진입 시 전체 파일을 스캔해 모든 페이지 경계를 계산하느라 1MB 에서 수 초, 40MB 에서는 분 단위로 걸렸습니다. 타 리더기(Murphy 3.7 등)가 같은 파일을 바로 여는 것과 같은 방식인 바이트 오프셋 기반 네비게이션으로 전환했습니다.
- 양쪽 정렬 동작 — 기존에는 TXT 에서 "양쪽 정렬"을 선택해도 조용히 왼쪽 정렬로 렌더링되던 문제를 수정해 실제로 양쪽 끝을 맞춥니다.
한국어 버전 변경 사항
성능
- TXT 파일 인덱싱 제거 — 파일 크기 무관하게 즉시 열림 (
TxtReaderActivity)- 이전 방식: 첫 진입 시 전체 파일을 스캔해 모든 페이지 시작 오프셋을
pageOffsets벡터에 저장. O(N) 시간·메모리. "Indexing..." 팝업이 수 초~분 단위 표시됨. - 새 방식: 현재 페이지의 바이트 오프셋
currentOffset만 보관. 렌더링 부산물로 다음 페이지 시작currentEndOffset을 얻음. 페이지 인덱스를 만들지 않으므로 O(1). - 뒤로 가기: 최근 256 페이지의 시작 오프셋을 스택에 보관. 그 이상은 샘플링된 페이지당 평균 바이트로 역산해 근사치 계산 (실제 이전 페이지와 한 페이지 이내 차이).
- 총 페이지 수 표시 (
N/M): 첫 렌더된 페이지의 바이트 수를 기반으로 추정. 진행도%는currentOffset / fileSize로 정확.
- 이전 방식: 첫 진입 시 전체 파일을 스캔해 모든 페이지 시작 오프셋을
progress.bin캐시 단순화: 페이지 오프셋 배열(파일당 수십 KB) 대신 현재 오프셋 1 개만 저장. 40MB TXT 의 캐시가 수십 바이트로 축소.
수정
- TXT 양쪽 정렬 실제 동작 —
loadPageAtOffset이 각 디스플레이 라인을 문단 끝 (소스의\n직전) vs 소프트 래핑된 중간 줄로 구분해 출력.renderPage가 소프트 래핑 줄에서는(contentWidth - textWidth)를 UTF-8 문자 사이 간격으로 고르게 분산하고, 문단 마지막 줄·페이지 마지막 줄은 왼쪽 정렬 유지. CJK (한국어) 는 문자 단위로 간격이 벌어지고, 영어는 대부분의 gap 이 공백 위치라 자연스럽게 단어 간 간격이 넓어지는 효과.
기술적 배경
| 측면 | 이전 (1.2.0-ko.6) | 이후 (1.2.0-ko.7) |
|---|---|---|
| 첫 진입 시간 | O(파일 크기), 1MB ~= 수 초, 40MB = 수 분 | O(1), 파일 크기 무관 |
| 메모리 사용 | pageOffsets 벡터 (페이지당 4 바이트) | 오프셋 + 256 항목 히스토리 스택 |
% 진행도 | 페이지 번호 기반 | 바이트 오프셋 기반 (정확) |
N/M 페이지 | 정확 | 첫 페이지 샘플 기반 추정 |
| 캐시 파일 크기 | 페이지 수에 비례 | 고정 ~40 바이트 |
| 양쪽 정렬 | 왼쪽 정렬로 폴백 (효과 없음) | 실제로 양쪽 끝 정렬 |
| 설정 변경 시 동작 | 전체 파일 재스캔 | 현재 오프셋 유지, 즉시 재렌더 |
사용자 영향
- TXT 파일 열기가 파일 크기에 무관하게 즉시. 양쪽 정렬이 실제로 동작. 설정(폰트/여백/줄 간격 등) 변경 시에도 재스캔 대기 없음.
- 한 번에 매우 깊이 뒤로 가기(256 페이지 이상) 시 이전 페이지 위치가 실제보다 한 페이지 이내로 어긋날 수 있음. 일반 독서에는 영향 없음.