LockTime

노트

화면을 느리게 하지 않고 화면 읽기

캡처하고, 읽고, 암호화하고, 색인하는 데 약 0.3초, CPU 코어 하나의 약 1%. 이 수치를 가능하게 한 세 가지 결정.

옅은 색의 평면을 가로지르는 가느다란 선 하나. 거의 평평합니다.

화면 기록의 비용은 매 간격마다, 영원히, 사용자가 다른 일을 하는 동안 백그라운드에서 치러집니다. 그러니 거의 0에 가까워야 합니다. ScreenCaptureKit으로 프레임을 캡처하고, Vision으로 텍스트를 읽고, 암호화하고, 기록하고, 색인하는 데 약 0.3초, 그리고 코어 하나의 약 1%가 듭니다.

가장 싼 작업은 건너뛴 작업

이 예산의 대부분은 쓰이지도 않습니다. 대부분의 간격이 변화 확인 단계에서 끝나기 때문입니다. 이전 프레임과 비교하는 이 단계는 비용이 거의 들지 않으며, 여기에는 보관할 만한 것이 없다고 판단합니다. 이 확인이 작동하는 방식은 별도의 노트에서 다룹니다.

같은 텍스트는 두 번 읽지 않습니다

텍스트 인식은 비용이 큰 단계입니다. 프레임이 바로 앞의 프레임과 충분히 비슷해서 단어가 바뀌었을 리 없다면, LockTime은 Vision을 다시 실행하는 대신 이전 텍스트를 그대로 이어받습니다. 화면을 읽는 데는 약 70ms가 걸립니다. 이미 읽은 것을 재사용하는 데는 약 1ms가 걸립니다.

인터페이스는 라이브러리를 기다리지 않습니다

스크린샷 20,000장이 담긴 라이브러리에서 하루치를 나열하는 데는 약 1밀리초가 걸립니다. 1초마다 기록한 하루 전체, 즉 86,400개의 순간을 띠 형태로 배치하는 데는 5.4ms가 걸려, 16ms인 프레임 하나 안에 여유 있게 들어갑니다. 라이브러리에 일주일치가 있든 1년치가 있든 윈도우는 디스플레이의 프레임 속도를 유지합니다.

두 종류의 컴퓨터를 위한 하나의 빌드

LockTime은 처음부터 끝까지 Swift와 SwiftUI로 만들어졌으며, Apple 실리콘과 Intel을 위한 하나의 유니버설 빌드로 배포됩니다. 이 제약은 생각보다 까다롭습니다. 선택 사항인 의미 검색은 임베딩을 16비트 부동소수점으로 저장하는데, Swift에서 가장 손쉬운 방법은 Float16입니다. 그런데 이 타입은 arm64에만 존재합니다. 그렇게 작성하면 앱은 Apple 실리콘 Mac에서 컴파일되고 테스트도 통과하지만, Intel용으로는 아예 빌드할 수 없습니다. 그래서 저장소는 대신 vImage를 통해 IEEE binary16을 기록하며, 테스트가 바이트 배치를 고정해 그 상태가 유지되도록 합니다.

이 모든 것은 눈에 보이지 않습니다. 바로 그것이 목적입니다. 실행 중이라는 것을 느낄 수 없어야 합니다.

모든 노트
Mac App Store에서 macOS 14 이상 · Apple 실리콘 및 Intel