모바일 리듬 게임의 저스트 프레임(Just Frame) 판정선 설계와 터치 레이턴시 보정 기획 가이드

모바일 환경에서 발생하는 오디오 및 터치 레이턴시의 원인을 분석하고 가변 주사율 환경에 대응하는 저스트 프레임(Just Frame) 판정 윈도우 수식, 캘리브레이션 UX, 델타 보정 시스템을 체계적으로 설계하는 방법을 정리합니다.

✓ 복사 완료!
챕터코어 메커니즘 & 루프
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
모바일 리듬 게임의 저스트 프레임(Just Frame) 판정선 설계와 터치 레이턴시 보정 기획 가이드

핵심 요약

모바일 리듬 액션 게임에서는 렌더 프레임 수 대신 오디오 재생 시각과 입력 이벤트 시각의 차이로 판정하는 방식을 사용할 수 있습니다. 입력 타임스탬프의 제공 여부와 시계 기준은 플랫폼과 입력 API에 따라 다르므로, 입력 시각을 DSP 타임라인에 맞추는 방법을 기기별로 검증해야 합니다. 지연값과 판정 창은 보편적인 상수가 아니므로 사용자 캘리브레이션과 실제 기기 측정으로 정합니다.


모바일 환경에서 리듬 게임 판정이 어긋나는 이유는 무엇일까?

아케이드 콘솔이나 전용 기기와 달리 스마트폰 환경은 파편화된 하드웨어, 운영체제(Android/iOS)의 오디오 믹서 드라이버, 정전식 터치스크린의 스캔 레이트(Touch Sampling Rate) 차이로 인해 심각한 입력/출력 불일치가 발생합니다.

개발자가 화면 중앙에 노트가 도달했을 때 정확한 타격감을 의도하더라도 실제 플레이어의 귀에 음악이 들리고 손가락이 화면에 닿아 엔진으로 이벤트가 전달되기까지는 다중 파이프라인 지연이 개입합니다.

지연 요소 (Latency Factor)AndroidiOS주요 발생 원인
오디오 출력 지연 (Audio Output)기기·오디오 경로별 측정기기·오디오 경로별 측정버퍼링과 출력 경로
터치 입력 지연 (Touch Input)기기·입력 API별 측정기기·입력 API별 측정터치 스캔과 이벤트 전달
디스플레이 렌더 지연 (Display)주사율·프레임 큐별 측정주사율·프레임 큐별 측정프레임 스케줄링과 버퍼링
블루투스 출력 (Bluetooth)코덱·기기·경로별 측정코덱·기기·경로별 측정무선 전송과 버퍼링

모바일 기기에서 발생하는 오디오 출력 및 터치 입력 파이프라인 지연 구조도

개별 지연을 더해 입력과 오디오가 어긋나는 정도를 추정할 수 있지만, 기기와 출력 경로를 지정하지 않은 채 하나의 총합 지연값으로 일반화할 수는 없습니다. 120 BPM에서 16분 음표 간격은 60,000/(120×4)=125ms60{,}000/(120\times4)=125\text{ms}입니다. 이는 리듬 간격의 예시일 뿐, 모든 기기의 지연이 이 값과 비슷하다는 뜻은 아닙니다.


저스트 프레임(Just Frame)과 판정 윈도우(Hit Window)의 수학적 설계

1. 프레임 종속 판정의 한계와 시간 기반 판정

격투 게임이나 과거 콘솔 리듬 게임은 60fps60\text{fps} 고정 환경에서 1프레임(16.67ms16.67ms) 단위로 저스트 프레임을 정의했습니다. 그러나 모바일 기기는 60Hz60\text{Hz}, 90Hz90\text{Hz}, 120Hz120\text{Hz}, 가변 주사율(ProMotion/LTPO) 등 화면 재생률이 다양합니다.

따라서 판정 로직은 프레임 틱 단위가 아닌 오디오 재생 시점을 기준으로 한 **절대 시간차(Δt\Delta t)**로 연산해야 합니다.

판정 오차 계산식은 다음과 같습니다:

Δt=(ttouch−taudio_base)−ttarget−tuser_offset\Delta t = (t_{\text{touch}} - t_{\text{audio\_base}}) - t_{\text{target}} - t_{\text{user\_offset}}

여기서 각 변수의 정의는 다음과 같습니다:

  • ttoucht_{\text{touch}}: OS 터치 이벤트가 발생한 하드웨어 타임스탬프 (msms)
  • taudio_baset_{\text{audio\_base}}: 오디오 트랙 재생이 시작된 기준 시각 (msms)
  • ttargett_{\text{target}}: 해당 노트가 정확히 판정선에 닿아야 하는 채보 상의 목표 시간 (msms)
  • tuser_offsett_{\text{user\_offset}}: 캘리브레이션을 통해 설정된 사용자/기기 고유 보정값 (msms)

2. 판정 윈도우(Hit Window) 등급 테이블 설계

판정 등급은 게임 템포와 캘리브레이션 오차를 고려해 다층적으로 구성할 수 있습니다. 아래 값은 예시 설정이며 모바일 터치 지터의 측정값이나 보편적으로 권장되는 기준이 아닙니다.

판정 등급 (Judgement)허용 오차 범위 (Δt\Delta t)점수 가중치콤보 유지 여부특징
Pure / Just Perfect±25ms\pm 25ms 이내100% (+가산점)유지정박 완벽 일치 (Just Frame)
Perfect±45ms\pm 45ms 이내100%유지일반 판정 허용치
Great±80ms\pm 80ms 이내70%유지조기/지연 타격 (Early/Late 표시)
Good±120ms\pm 120ms 이내40%유지 (또는 끊김)리듬 이탈 감지
Miss / Poor∣Δt∣>120ms\lvert\Delta t\rvert > 120ms 또는 미입력0%초기화패널티 부여 및 게이지 감소

오프셋 보정(Calibration) 시스템과 UX 기획

하드웨어마다 다른 터치/오디오 지연을 일괄적인 상수로 처리할 수 없으므로 플레이어가 자신의 기기와 신체 반응에 맞춰 수치를 맞추는 캘리브레이션 시스템이 필수적입니다.

3단계 측정 및 보정 프로세스 (Step-by-Step)

  1. 시각적 동기화 단계 (Visual Metronome): 소리 없이 일정한 주기로 깜빡이는 판정선을 터치해 사용자가 느끼는 시각-터치 오차를 측정합니다. 이 값만으로 패널의 물리적 지연을 분리 측정할 수는 없습니다.
  2. 청각적 동기화 단계 (Audio Metronome): 일정한 비트(예: 120 BPM120\text{ BPM} 가이드 비프음)에 맞춰 최소 8~16회 화면을 탭하여 오디오-터치 복합 지연을 수집합니다.
  3. 이상치 필터링 및 오프셋 산출 (Data Processing): 수집된 타격 시점 데이터 중 사전에 정한 기준에 따라 이상치를 표시하고, 표본 수와 분포를 확인한 뒤 평균 또는 중앙값을 오프셋 후보로 저장합니다. 표본 8~16회는 초기 UX 실험의 예시일 뿐 충분한 측정 수를 보장하지 않습니다.
flowchart TD
    A[캘리브레이션 시작] --> B[120 BPM 메트로놈 비프음 출력]
    B --> C[플레이어 16회 탭 입력 수집]
    C --> D[개별 타격 오차 Δt_i 계산]
    D --> E[IQR 기준 밖 표본 표시 및 검토]
    E --> F[잔여 데이터 평균 또는 중앙값 산출]
    F --> G[최종 사용자 오프셋 t_user_offset 저장]
    G --> H[테스트 플레이로 판정 검증]

통계적 보정값 산출 수식

단순 산술 평균은 플레이어의 실수로 인한 극단값에 취약하므로 수집된 표본 NN개에서 사분위간 범위(IQR) 또는 표준편차(σ\sigma)를 활용해 유효 표본 집합 SvalidS_{\text{valid}}를 선별한 뒤 평균을 도출합니다.

tuser_offset=1∣Svalid∣∑i∈Svalid(ttap,i−texpected,i)t_{\text{user\_offset}} = \frac{1}{|S_{\text{valid}}|} \sum_{i \in S_{\text{valid}}} (t_{\text{tap}, i} - t_{\text{expected}, i})

리듬 액션 게임 판정 캘리브레이션 튜토리얼 화면과 오프셋 조절 UI 예시


실시간 런타임 레이턴시 동기화 및 입력 처리 구현

엔진의 Update() 루프는 가변 프레임률의 영향을 받습니다. 입력 시스템이 이벤트 시각을 제공하면 콜백 처리 시각과 구분해 사용할 수 있지만, 그 시각이 하드웨어 원시 타임스탬프인지와 DSP 시계로 변환하는 방법은 API별로 확인해야 합니다. Unity 레거시 Touch의 deltaTime은 마지막 터치 업데이트 후 경과 시간이지 절대 이벤트 시각은 아닙니다.

다음 판정 코어는 touchTimestampDeltaMs가 콜백 시점의 DSP 경과 시간과 같은 기준으로 변환된 뒤, 현재 DSP 시각과 터치 이벤트 시각 사이의 지연(ms)을 뜻한다고 가정합니다. 플랫폼 어댑터가 이 값을 제공해야 하며 Unity 레거시 Touch에서 곧바로 얻을 수 있는 값은 아닙니다.

using UnityEngine;
using System;

public enum JudgementType
{
    JustPerfect,
    Perfect,
    Great,
    Good,
    Miss
}

public class RhythmJudgeSystem : MonoBehaviour
{
    [Header("Hit Window Settings (ms)")]
    public float justPerfectWindow = 25f;
    public float perfectWindow = 45f;
    public float greatWindow = 80f;
    public float goodWindow = 120f;

    [Header("Calibration")]
    public float userOffsetMs = 0f; // 캘리브레이션 설정값

    public AudioSource musicSource;
    private double audioDspStartTime;

    public void StartSong()
    {
        // 오디오 스레드 스케줄링을 통한 정밀 재생
        audioDspStartTime = AudioSettings.dspTime + 0.5;
        musicSource.PlayScheduled(audioDspStartTime);
    }

    public double GetCurrentAudioTimeMs()
    {
        // DSP 기반의 정밀 경과 시간 (밀리초)
        double elapsedDspSeconds = AudioSettings.dspTime - audioDspStartTime;
        return elapsedDspSeconds * 1000.0;
    }

    public JudgementType EvaluateHit(double noteTargetTimeMs, float touchTimestampDeltaMs)
    {
        // 호출자가 동일한 DSP 기준으로 환산한 이벤트 경과 시간만 전달해야 합니다.
        double currentSongTimeMs = GetCurrentAudioTimeMs() - touchTimestampDeltaMs;
        
        // 판정 편차 연산
        double deltaMs = currentSongTimeMs - noteTargetTimeMs - userOffsetMs;
        double absDelta = Math.Abs(deltaMs);

        if (absDelta <= justPerfectWindow)
            return JudgementType.JustPerfect;
        if (absDelta <= perfectWindow)
            return JudgementType.Perfect;
        if (absDelta <= greatWindow)
            return JudgementType.Great;
        if (absDelta <= goodWindow)
            return JudgementType.Good;

        return JudgementType.Miss;
    }
}

자주 묻는 질문 (FAQ)

Q1. 60Hz 기기와 120Hz 고주사율 기기 간 판정 차이를 어떻게 확인하나요?

판정을 오디오 시계 기준으로 계산하면 렌더 주사율 자체를 판정 단위로 쓰지 않을 수 있습니다. 다만 디스플레이 갱신, 터치 샘플링, OS 이벤트 전달 차이는 남을 수 있으므로 실제 목표 기기에서 입력 경로를 측정하고 캘리브레이션 효과를 확인해야 합니다. Just Perfect 범위도 게임 설계와 측정 결과에 맞춰 정하며 아래 표의 수치를 보편 권장치로 해석하지 않습니다.

Q2. 블루투스 이어폰(TWS)의 가변 레이턴시는 어떻게 대응해야 하나요?

블루투스 음향 기기의 지연은 기기, 코덱, OS, 연결 상태와 앱의 오디오 경로에 따라 달라질 수 있습니다. 고정 오프셋 프리셋을 일반값으로 두기보다 연결 경로별 캘리브레이션을 제공하고, 해당 경로에서 측정한 결과를 사용자가 확인하도록 설계합니다.

Q3. 판정 윈도우를 곡 난이도(Difficulty)에 따라 동적으로 변경해도 되나요?

일반적으로 아케이드 스타일의 정통 리듬 게임에서는 판정 범위를 고정하여 플레이어가 일관된 타격 감각을 유지하도록 돕습니다. 반면 난이도별 완급 조절이 필요한 캐주얼 리듬 게임의 경우, Easy 난이도에서는 Great/Good 범위를 1.5배 넓히되 최고 랭크를 결정짓는 Just Perfect 범위는 고정하는 형태의 절충안을 사용하는 것이 게임성 유지에 유리합니다.


요약 및 결론

모바일 리듬 액션 게임에서 타격 판정의 정확도는 게임의 신뢰도를 결정짓는 핵심 기획 요소입니다.

  1. 절대 시간 동기화: 렌더링 프레임 틱 종속성을 제거하고 오디오 DSP Time 기준 판정 시스템을 구축하십시오.
  2. 다층 지연 상쇄: 하드웨어 터치 타임스탬프와 사용자 오프셋(toffsett_{\text{offset}})을 공식에 포함하십시오.
  3. 직관적인 캘리브레이션: 시각·청각 메트로놈과 측정 결과 확인 절차를 제공하고, 지원 기기에서 실제로 달성한 오차 범위를 검증해 안내합니다.