PART 7 · 강의 2/3

비동기 물리와 서브스테핑

Async Physics Tick, 고정 타임스텝, 프레임레이트 독립 시뮬레이션

01

비동기 물리 (Async Physics)

별도 스레드에서 고정 타임스텝 물리 실행

Async Physics는 물리 시뮬레이션을 게임 스레드와 독립된 타이밍에 고정 타임스텝(Fixed Timestep)으로 실행하는 모드입니다. 프레임레이트에 관계없이 일관된 물리 결과를 보장합니다.

모드물리 타이밍결정론적적합한 게임
Sync (기본)게임 Tick과 동기아니오단일 플레이어, 간단한 물리
Async고정 DeltaTime예 (조건부)멀티플레이어, 물리 기반 게임
프로젝트 설정
// Project Settings > Physics > Framerate // TickPhysicsAsync = true // AsyncFixedTimeStepSize = 0.01667 (60 Hz) // DefaultEngine.ini 에서 직접 설정: [/Script/Engine.PhysicsSettings] TickPhysicsAsync=True AsyncFixedTimeStepSize=0.01667
Async와 Substepping은 상호 배타적

UE5에서 Async Physics와 Substepping은 동시에 사용할 수 없습니다. Async Physics를 활성화하면 Substepping은 자동으로 비활성화됩니다. 둘 중 프로젝트에 맞는 방식을 선택해야 합니다.

02

서브스테핑 (Substepping)

가변 프레임에서 물리 안정성 확보

서브스테핑은 게임 프레임의 DeltaTime이 클 때(프레임 드롭 시), 물리 시뮬레이션을 여러 번의 작은 스텝으로 나누어 실행하는 기법입니다.

서브스테핑 동작 원리
// 예: 게임이 30fps로 실행될 때 (DeltaTime = 0.033s) // Max Substep DeltaTime = 0.01667s (60Hz) // 필요한 서브스텝 수 = ceil(0.033 / 0.01667) = 2 // 물리 솔버가 0.01667s x 2 = 0.0333s 만큼 시뮬레이션 // 각 서브스텝에서 솔버 반복이 수행됨 // 프레임이 60fps (DeltaTime = 0.01667s)이면 // 서브스텝 없이 1회만 실행
설정설명권장값
bSubstepping서브스테핑 활성화true (필요 시)
MaxSubstepDeltaTime서브스텝 최대 DeltaTime1/60 (0.01667s)
MaxSubsteps최대 서브스텝 횟수6
언제 서브스테핑을 사용할까

가변 프레임레이트에서 물리 안정성이 필요할 때 사용합니다. 고정 60fps를 보장할 수 있다면 서브스테핑이 불필요할 수 있습니다. 반면, 프레임 드롭이 빈번한 환경(모바일, 복잡한 씬)에서는 서브스테핑이 물리 안정성을 크게 향상시킵니다.

03

Async Physics Tick 활용

비동기 물리와 게임 로직 연동

C++ - Async Physics Tick 사용
// Actor에서 Async Physics Tick 활성화 AMyPhysicsActor::AMyPhysicsActor() { // Async Physics Tick 활성화 bAsyncPhysicsTickEnabled = true; } // Async Physics Tick에서 호출되는 함수 void AMyPhysicsActor::AsyncPhysicsTickActor( float DeltaTime, float SimTime) { // 이 함수는 Physics Thread에서 호출됨! // 고정 DeltaTime으로 일관된 물리 로직 실행 // 물리 기반 이동 계산 FVector Force = CalculateForce(); // 직접 물리 바디에 힘 적용 if (FBodyInstance* Body = MeshComp->GetBodyInstance()) { Body->AddForce(Force, false); } } // 주의: AsyncPhysicsTickActor에서는 // - Game Thread 전용 함수 호출 금지 // - UObject 생성/삭제 금지 // - 위젯/UI 접근 금지
Thread Safety 주의

AsyncPhysicsTickActorPhysics Thread에서 호출됩니다. Game Thread 전용 함수(SpawnActor, UI 업데이트 등)를 호출하면 크래시가 발생합니다. 물리 관련 연산만 수행하고, 게임 로직은 일반 Tick에서 처리하세요.

04

네트워크 물리 예측

Async Physics와 네트워크 동기화

Async Physics의 가장 큰 이점 중 하나는 네트워크 물리 예측(Network Physics Prediction)입니다. 고정 타임스텝으로 시뮬레이션이 결정론적(Deterministic)으로 실행되면, 클라이언트가 서버 결과를 예측할 수 있습니다.

네트워크 물리 핵심 개념
  • 결정론적 시뮬레이션 — 같은 초기 상태 + 같은 입력 = 같은 결과. 고정 타임스텝이 전제 조건입니다.
  • 클라이언트 예측 — 클라이언트가 입력을 즉시 시뮬레이션하여 지연 없는 반응을 제공합니다.
  • 서버 검증 — 서버가 권위적(Authoritative) 시뮬레이션을 수행하고 결과를 브로드캐스트합니다.
  • Rollback/Resimulation — 서버 결과와 클라이언트 예측이 다르면 되감기 후 재시뮬레이션합니다.
Physics Replication

UE5에서는 UPhysicsReplicationComponent를 통해 기본적인 물리 리플리케이션을 제공합니다. Chaos Vehicle이나 물리 기반 캐릭터에 Async Physics를 활성화하면 네트워크 동기화가 크게 개선됩니다.

SUMMARY

핵심 요약

  • Async Physics는 고정 타임스텝으로 물리를 실행하여 프레임레이트 독립적 시뮬레이션을 보장합니다.
  • Substepping은 가변 프레임에서 물리 안정성을 위해 DeltaTime을 분할합니다.
  • Async Physics와 Substepping은 상호 배타적입니다.
  • AsyncPhysicsTickActor()에서는 물리 연산만 수행하고, Game Thread 전용 함수 호출을 피합니다.
  • Async Physics는 네트워크 물리 예측의 기반이며, 멀티플레이어 게임에 권장됩니다.
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Async Physics 활성화 및 테스트

Project Settings에서 Tick Physics Async를 활성화하고, 고정 타임스텝(30Hz, 60Hz, 120Hz)에서의 시뮬레이션 차이를 비교하세요. 빠른 물체의 터널링 발생 여부를 테스트하세요.

실습 2: 서브스테핑 파라미터 튜닝

Max Substep Delta Time과 Max Substeps를 조정하며 고속 물체(총알)의 충돌 정확도를 개선하세요. CCD와 서브스테핑의 조합으로 터널링을 방지하세요.

심화 과제: 비동기 물리 게임플레이 적용

AsyncPhysicsTickComponent를 사용하여 물리 스레드에서 직접 힘을 적용하고, Game Thread와의 데이터 동기화를 안전하게 처리하는 Actor를 C++로 구현하세요.