신호를 표시하는 코드가 출발점
대기 타이머의 콜백이 실행되면 performance.now()를 신호 시각으로 기록하고 NOW! 상태를 표시합니다. 예정된 타이머 시각이 아니라 실제 콜백의 시각을 사용합니다.
입력의 event.timeStamp는 같은 performance clock 기준으로 정규화합니다. epoch 기준 시각이면 timeOrigin을 빼며, 유효하지 않은 시각은 현재 시각으로 대체합니다. 반응시간은 정규화된 입력 시각에서 신호 시각을 뺀 값입니다.
| 단계 | 기록·처리 | 별도로 보정하지 않는 것 |
|---|---|---|
| 신호 코드 실행 | 신호 시각 기록, NOW! 표시 요청 | 화면 픽셀이 실제로 빛나는 순간 |
| 사용자 입력 | 키·터치 이벤트 시각 정규화 | 스위치·터치 패널의 내부 지연 |
| 결과 | 두 시각의 차이를 비교 | 개인의 생리적 반응만 분리한 값 |
12ms는 첫 입력 뒤 기다리는 시간
첫 유효 입력이 들어오면 그 플레이어의 시각을 저장하고 약 12ms 뒤 판정을 예약합니다. 두 번째 입력이 먼저 들어오면 두 시각으로 바로 판정합니다. 따라서 신호가 켜진 뒤 12ms 안에 반응해야 한다는 규칙이 아닙니다.
12ms 버퍼는 근접한 두 이벤트를 받을 여유이고, 8ms는 수집된 두 반응시간 차이를 무승부로 보는 경계입니다. 이벤트 처리가 크게 늦어진 기기까지 모든 동시 입력을 보장하는 장치는 아닙니다.
8ms 경계를 계산으로 확인
아래 값은 판정 함수에 넣는 설명용 입력입니다. 실제 이용자 기록이나 기기 측정 결과가 아닙니다. 두 입력이 판정 전에 수집됐다고 가정합니다.
| P1 반응 | P2 반응 | 차이 | 판정 |
|---|---|---|---|
| 200ms | 208ms | 8ms | 무승부, 점수 없음 |
| 200ms | 209ms | 9ms | P1 승리 |
| 입력 없음 | 220ms | 비교 불가 | P2 승리 |
대기 시간은 일정한 박자가 아님
새 라운드의 대기는 약 1.35–3.75초 범위에서 Math.random()을 변형해 정합니다. 범위 안의 모든 시간이 같은 확률은 아닙니다. 짧은 쪽에 더 많은 값이 배치되는 곡선이므로 일정한 평균 박자를 외우는 연습은 신호 확인을 대신하지 못합니다.
신호가 오기 전에 누르면 상대에게 1점입니다. 대기시간의 난수는 놀이의 변화를 위한 것으로 사다리·룰렛의 보안 추첨과 구분합니다.
같은 기기에서 비교 조건 맞추기
- 두 사람 모두 F·J 키 또는 두 터치 버튼 중 한 방식만 선택합니다.
- 화면 중앙을 함께 보고 손가락을 미리 누르지 않은 상태로 둡니다.
- 3점 매치를 하고 부정 출발도 결과와 함께 메모합니다.
- 자리를 바꿔 새 매치를 합니다. 키 위치와 손 자세 차이가 있었는지 확인합니다.
탭 전환이나 일시정지가 끼면
탭이 숨겨지면 진행 중인 게임은 자동 일시정지되며 복귀만으로 재개하지 않습니다. 두 사람이 준비됐을 때 계속하기를 누르세요. 비교를 단순하게 하려면 방해가 있던 라운드를 따로 메모하고 새 매치를 합의할 수 있습니다.
서로 다른 휴대전화, 키보드·터치 혼합, 다른 브라우저에서 나온 최저 기록을 같은 척도로 순위 매기지 마세요. 현재 구현은 디스플레이·입력 하드웨어의 지연을 독립적으로 계측하지 않습니다.
다음 대결에서는 숫자와 실수를 함께 보기
최저 ms 하나만 남기기보다 같은 설정의 매치 승패, 부정 출발 여부, 입력 방식을 같이 적어 보세요. 평균 기록을 자동 집계하거나 온라인 순위를 제공하는 기능은 현재 없습니다. 아래 기본 가이드에서 조작을 확인한 뒤 바로 대결할 수 있습니다.
자주 묻는 질문
8ms 무승부는 기기 오차를 측정해서 정한 값인가요?
게임이 정한 판정 경계입니다. 기기별 오차를 계측한 인증 수치나 정확도 보증이 아닙니다.
12ms가 지나면 반응하지 못한 것인가요?
아닙니다. 첫 유효 입력 뒤 다른 입력을 기다리는 버퍼입니다. 신호부터 첫 입력까지의 제한시간이 아닙니다.
브라우저 기록으로 반응 능력을 진단할 수 있나요?
이 게임은 오락용 상대 비교입니다. 표시·입력 지연을 분리하지 않아 전문적인 능력 평가나 진단 근거로 사용할 수 없습니다.