브라우저 벤치마크 2.0을 만든 방법
벤치마크가 끝나기 직전에 멈추거나 실행마다 점수가 크게 달라지면 결과를 믿기 어렵습니다. 2.0을 만들면서 이런 실패 사례를 먼저 정리하고 측정 방식과 종료 경로를 설계했습니다. 이 글은 당시 설계 기록이며 현재의 시간 제한과 계산식은 측정 방법 문서가 기준입니다.
FPS 대신 부하를 찾기
부하를 고정하고 FPS를 재는 방식은 브라우저에서 주사율에 막히기 쉽습니다. 충분히 빠른 기기들이 모두 60이나 120으로 표시되면 처리 여유를 구분하기 어렵습니다. 반대로 느린 기기에서는 같은 부하가 지나치게 무거울 수 있습니다.
그래서 16.67ms의 프레임 시간 기준을 고정하고 부하를 바꾸기로 했습니다. 점차 부하를 늘린 뒤 경계 사이를 탐색하고, 후보를 채택하기 전에 세 구간 연속 통과를 요구합니다. 성운 입자 840,000개처럼 장면별로 확인한 최대 안정 부하가 결과의 바탕이 됩니다.
느린 기기에서는 같은 부하 단계의 낮은 위치에서 측정값을 찾을 수 있습니다. 모든 기기에 같은 높은 부하를 강요하는 방식보다 넓은 범위를 다루기 쉽습니다.
평균값에 가려지는 끊김을 보기
각 구간의 평균과 95백분위 프레임 시간을 함께 확인합니다. 대다수 프레임이 빠르더라도 40ms가 걸리는 프레임이 반복되면 사용감은 달라집니다. 백분위도 모든 멈춤을 설명하지는 않지만 평균만 보는 것보다 느린 쪽의 분포를 살피는 데 도움이 됩니다. 일시적인 이상 구간은 다시 측정하고 연속 실패는 부하가 너무 크다는 신호로 처리합니다.
종료 경로를 갖춘 상태 머신
각 장면은 preflight, baseline, warmup, ramp, bracket, confirm, anchor 단계를 거칩니다. 모든 단계에 정상 완료 외의 종료 경로도 마련했습니다.
- 초기 설계의 시간 제한은 장면당 30초, 실행 전체 150초였습니다. 이후 전체 제한은 장면 수에 맞춰 계산하도록 수정했습니다.
- 탭이 배경으로 가면 현재 구간을 버리고 일시 정지합니다. 30초 넘게 숨겨져 있으면 이유를 표시하고 종료합니다.
- 창 크기나 픽셀 비율이 달라지면 잘못된 조건에서 계속 재지 않고 장면을 다시 준비합니다.
- WebGL 컨텍스트 손실, 장시간 프레임 응답 없음, 장면 예외는 각각의 종료 이유로 기록합니다. 별도의 감시 타이머도 둡니다.
- Esc 취소는 특정 단계에서만 가능한 기능이 아니라 전체 실행 과정에서 처리합니다.
일찍 끝나거나 일부 측정에 문제가 생기거나 사용자가 취소할 수는 있습니다. 중요한 것은 가능한 한 이유를 남기고 결과 화면이나 원래 페이지로 돌아오게 하는 것입니다. 브라우저 프로세스 자체의 정지까지 막는다는 뜻은 아닙니다.
실행 중 성능 변동을 표시하기
지속적인 GPU 부하는 기기를 데웁니다. 시작과 끝에서 같은 가벼운 기준 부하를 측정해 마지막이 15% 넘게 느려졌다면 상태 변동을 표시합니다. 발열에 따른 제한이 원인일 수 있지만 다른 작업도 영향을 줄 수 있습니다. 표시와 제한된 감점은 결과에 남고, 공유한 샘플에도 상태를 담아 공개 중앙값에서 구분할 수 있게 합니다.
고주사율 화면에 같은 기준 적용하기
120Hz 화면에서 매 프레임 8.3ms를 요구하면 60Hz의 16.67ms보다 두 배 엄격해집니다. 이 테스트는 화면과 무관하게 16.67ms 기준을 씁니다. 가벼운 부하에서 더 많은 프레임을 보여 주더라도 통과 조건 자체는 바뀌지 않습니다.
이번 설계에 넣지 않은 것
현재 점수에는 WebGPU를 섞지 않습니다. 도입한다면 별도 프로필과 비교 기준이 필요합니다. 이 버전의 렌더링은 메인 스레드에서 수행하며 Worker의 종료와 컨텍스트 전송 같은 추가 경로는 도입하지 않았습니다. 통계 역시 충분한 표본이 모이기 전에는 과도하게 정밀한 순위를 제시하지 않도록 합니다. 예를 들어 40회 정도의 결과만으로 모든 기기의 분포를 대표한다고 보기는 어렵습니다.
현재의 정확한 채점식과 제한은 측정 방법에 있습니다. 실행이 멈추거나 설명과 다르게 동작하면 admin at screentest.pro로 재현 방법을 알려 주세요.