본문 바로가기

카테고리 없음

싱글게임에서 시간동기화 알고리즘


🎯 싱글 게임에서 시간 동기화란?

> "게임 내 모든 시스템(애니메이션, 물리, AI 등)이 동일한 '시간의 흐름'을 기준으로 움직이도록 동기화하는 것."




---

⏱️ 1. 주요 용어

용어 설명

deltaTime 이전 프레임과 현재 프레임 간 경과 시간 (초 단위)
Fixed timestep 일정한 시간 간격으로 게임 로직/물리 처리 (예: 16.6ms = 60FPS)

Unscaled time 게임 일시정지/슬로우모션과 관계없는 실시간 흐름
Scaled time Time.timeScale과 함께 사용하는, 게임 내 시간의 흐름 속도



---

🔧 2. 싱글 게임에서 주로 사용되는 시간 동기화 알고리즘

✅ A. Fixed Time Step 알고리즘 (권장)

기본 구조:

accumulator += deltaTime
while accumulator >= fixedDeltaTime:
    updatePhysics(fixedDeltaTime)
    accumulator -= fixedDeltaTime
render()

장점:

물리/AI/이벤트 등의 업데이트가 항상 같은 시간 간격으로 실행됨

재현성 높음 (같은 입력 → 같은 결과)

튀는 프레임에도 게임 로직 안정


단점:

렌더링과 로직이 분리되기 때문에 interpolation 필요

너무 낮은 fixedDeltaTime은 CPU 과부하



---

✅ B. Variable Time Step 알고리즘 (간단하지만 불안정)

updateGameLogic(deltaTime)
render()

매 프레임마다 실제 경과 시간만큼 로직 실행

deltaTime은 불안정할 수 있어 물리엔진이나 정밀 시뮬레이션에 부적합



---

✅ C. Time Scaling & Pause-safe Time

게임 일시정지나 슬로우모션을 위해 Time.timeScale 활용

Time.deltaTime × timeScale → 게임 내 시간 흐름

UI 애니메이션 등은 unscaledDeltaTime 사용하여 독립적 동작



---

⚙️ 3. Unity 기준 예시 (C#)

void Update() {
    float dt = Time.deltaTime;                // 프레임 간 시간
    float realTime = Time.unscaledDeltaTime;  // 일시정지 무시 시간
    timePassed += dt;

    if (timePassed >= fixedInterval) {
        DoGameLogic(); // 고정 틱마다 처리
        timePassed = 0f;
    }

    AnimateUI(realTime); // UI는 항상 실시간 기준
}


---

📚 추천 자료

📘 Game Programming Patterns - “Game Loop” & “Update Method” 챕터

📘 Fix Your Timestep by Glenn Fiedler (GafferOnGames): https://gafferongames.com/post/fix_your_timestep/

📘 Unity 공식 문서: Time



---

✅ 결론 요약

알고리즘 특징 사용 용도

Fixed Time Step 일정한 간격으로 업데이트, 재현성 ↑ 물리, AI, 정밀 이벤트 처리
Variable Time Step 구현 쉬움, 프레임마다 경과시간 처리 일반 로직, 빠른 프로토타입
Time Scaling 시간 흐름 제어 (슬로우모션, 일시정지 등) 게임 컨트롤, UI 동기화 등