개요
언리얼엔진의 물리연산은 Determinism(결정론적 동작)을 보장하고 있지 않지만 Physics Divergence(물리 연산의 오차 발산)을 막기 위해 어느정도 고려하고 있습니다. 특히 네트워크 동기화에서는 매 Frame마다 물리 연산이 조금이라도 달라지면 짧게는 수 Frame, 길게는 수 초 후의 결과가 완전히 달라지기 때문에 여러 구조적 개선을 지속적으로 진행해왔습니다. 이 글은 그러한 언리얼 엔진의 Physics를 Determinism 관점으로 오차 최소화를 어떻게 달성하였는지에 대해 정리한 글입니다.
언리얼엔진의 물리, 각 스텝 정리
[1] PrePhysics
Actor Tick (PrePhysics Group)
- 입력 처리 / 이동 요청 확정
- 물리에 들어가기 전 게임 상태 정리(게임 로직 기반 상태 업데이트)
- Determinism 관점
- Lockstep에서 "동일한 입력"이 보장되어야 하므로 이 단계가 핵심입니다.
- 모두 같은 프레임에서 같은 입력을 받고 동일한 초기 상태를 맞춰야 Physics Divergence를 방지할 수 있습니다.
▼ (Barrier: 모두 완료 시 다음 단계)
[2] StartPhysics
- Chaos Physics 엔진에 Step 시작 명령
- Substep 준비
- Collision BroadPhase 준비
- Determinism 관점
- Substep 개수, Step 간격, BroadPhase(충돌 탐색 알고리즘 순서)가 플랫폼과 스레드에 영향을 받지 않게 유지될수록 Determinism이 향상된다.
- UE5에서 이곳의 안정성을 강화하고 있습니다.
▼
[3] DuringPhysics
- Substep 단위로 Physics Integration
- 강체를 이동시킨 후, 충돌 감지, 반응 계산을 병렬로 수행
- Solver 수행
- Chaos Simulation 실행
- Determinism 관점
- 가장 Non-deterministic한 단계로 이 단계에서는 Divergence가 아래의 세가지 이유로 발생합니다.
- Floating point차이
- 멀티스레드 스케줄링 차이
- Solver 순서 차이
- 그렇기에 Lockstep 구현 시에는 Fixed Step, Fixed Seed, 동일 Substep을 강제로 통일합니다.
- 가장 Non-deterministic한 단계로 이 단계에서는 Divergence가 아래의 세가지 이유로 발생합니다.
▼ (Barrier: 모든 물리 연산 완료 시 다음 단계)
[4] EndPhysics (PostPhysics)
- Physics 결과를 게임 월드로 반영
- Transform Sync
- CharacterMovement / VehicleMovement 이동 보정(RootMotion/Prediction 보정)
- PostPhysics Tick 실행
- Determinism 관점
- Physics가 만든 결과가 실제 게임 로직으로 흘러 들어가는 구간으로 Lockstep에서의 값들이 모든 클라이언트에 동일해야 이후 Prediction/Interpolation이 안정적으로 작동합니다.
▼
[5] PostUpdate
- During Physics의 모든 병렬 스레드를 대기하여 정리
- Rendering 준비
- Determinism 관점
- 물리 결과가 렌더링 이전에 완전히 확정되는 곳입니다. 즉 Lockstep에서는 Frame Boundary가 되는 지점입니다.
Solver란?
물리 연산 과정에서 발생한 힘, 속도, 충돌 등을 정리하여 게임에 맞게 보정하는 단계입니다. Chaos에서는 충돌 후의 위치, 속도, 반응을 반복 계산(Iterative Solve)하여 안정적인 결과로 수렴시키며, 최종적으로는 게임 월드에 반영하기 적합한 형태로 물리 상태를 정제하는 역할을 합니다.
Substep이란?
하나의 물리 Frame을 여러개의 더 작은 시간 단위로 나누어 여러 번 시뮬레이션을 수행하는 구조입니다. 그로 인해 PhysicsThread는 고정된 시간 간격(Fixed Step)으로 더 촘촘하게 물리를 계산할 수 있습니다. 기본적으로 GameThread의 Tick 속도와 관계없이 진행됩니다. 하지만 PrePhysics와 PostPhysics가 GameThread에 종속되어 있기 때문에 시작과 끝으로 동기화 된다고 보시면 됩니다.
Substep은 다음 목적에서 사용됩니다.
- 빠르게 움직이는 객체의 충돌 누락 방지
- 폭발, 충돌 등 입출력이 빠르게 변하는 상황에서 안정적인 결과 유지
- Lockstep에서 모든 클라이언트가 동일한 수의 Substep을 수행하도록 강제하여 Determinism을 향상시킴
결론
이처럼 물리 파이프라인의 각 단계를 통일된 방식으로 처리하여 Lockstep 구조에서 발생하는 Physics Divergence를 크게 줄일 수 있습니다. 또한 UE5가 지속적으로 강화하고 있는 Substep·Solver·Tick 구조는 Determinism을 향상시키는 방향으로 설계되어 있어 언리얼엔진에 있어 네트워크 게임에서의 물리 불일치 문제를 완화하는 핵심 축이 되었습니다.
'Game Programming > Unreal Engine' 카테고리의 다른 글
| UE2의 Overlay Shader와 초기 Post Process Effect (0) | 2025.12.01 |
|---|

