셋 다 멀티플레이 동기화 방식핵심 차이는 무엇을 맞추는가? LockStep : 입력을 기다렸다가 같이 진행Rollback : 일단 진행하고 틀리면 되감기state sync : 결과 상태 계속 보내서 맞춤 LockStep개념: 모든 플레이어가 현재 Tick 의 입력을 다 보낼때까지 기다린 뒤 그 Tick을 함께 시뮬레이션 하는 방식 즉, 100번 Tick 입력 다 모임그제서야 100번 Tick 실행101번 Tick도 입력 다 모이면 실행 특징전부 같은 입력으로 같은 Tick을 돌리므로 결과가 잘 맞음대신 한 명이라도 느리면 다 같이 느려짐장점네트워크 사용량 적음deterministic simulation 이 잘 맞으면 매우 정확리플레이 만들기 쉬움단점입력 지연 체감이 큼반응석이 중요하면 답답함결정론 ..

전체 글
게임 개발자의 일기장Input Sync멀티플레이에서 각 플레이어의 입력을 같은 시점에 맞춰서 공유하고 적용하는 방식 쉽게 말하면- A가 누른 입력- B가 누른 입력을 각자 따로 처리하는 게 아니라, "N번 Tick에서 모두 이 입력들을 사용한다" 하고맞춰서 시뮬레이션 하는 것 필요한 이유deterministic simulation 은초기 상태가 같고같은 Tick 에같은 입력이 들어가면모든 클라이언트가 같은 결과를 낼 수 있다. 그래서 상태(position, hp, physics 결과)를 계속 보내는 대신입력만 동기화해서 각자 똑같이 계산하게 만드는 것 예시)2인 게임에서 100번 Tick 에A 입력: 오른쪽 이동B 입력: 점프라고 하면, PC(A) 와 PC(B) 둘 다 100번 Tick에서 저 두 입력을 똑같이 적용 ..
Fixed Tick시뮬레이션을 항상 일정한 시간 간격으로 업데이트 하는 방식 예를 들면:1 Tick = 0.02초초당 50번 업데이트처럼 시간을 잘게 고정해서 계산하는 것 사용 이유프레임마다 시간 간격이 다르면어떤 프레임은 0.016초어떤 프레임은 0.033초이렇게 들쭉날쭉해서 결과가 달라질 수 있음 Deterministic simulation 과 관계Fixed Tick 은 결정론에 아주 중요같은 입력이 같은 Tick 에 들어오고,매 Tick 계산도 동일하면 결과를 맞추기 쉬움그래서 보통Tick 번호 기준으로 입력 처리고정된 dt로 시뮬레이션렌더링은 따로이런 식으로 나눈다. Unity 로 보면Unity의 Update는 프레임마다 호출돼서 간격이 일정하지 않고,FixedUpdate() 는 고정 시간 ..
Deterministic simulation (결정론적 시뮬레이션)결정론적 시뮬레이션은같은 입력이 들어오면 언제나 같은 결과가 나오는 시뮬레이션이다. ex)시작 상태가 같고시간 흐름이 같고입력값이 같으면 매번 실행해도 오브젝트 위치, 충돌 결과, 수치 계산 결과가 완전히 똑같이 나와야 하는 것 중요한 이유:멀티플레이 lockstep: 입력만 서로 주고받고 각 클라이언트가 같은 결과를 계산해야 할 때Replay 시스템: 입력 기록만 저장해두고 그대로 다시 재생할 때서버/클라 동기화: 양쪽이 같은 로직을 돌려 같은 결과를 기대할 때디버깅: 같은 버그를 정확히 재현하기 쉬움 반대는 non-deterministic simulation: 같은 조건처럼 보여도 실행할 때마다 결과가 조금씩 달라지는 것 원인 예시:..
Interpolation (보간)고정 Tick 의 장점은 시뮬레이션이 안정적이라는 것이다. 그런데 단점도 있다.Tick은 예를 들어 30Hz 라면 0.033초마다 상태가 바뀐다. 즉, 실제 위치가 이렇게 바뀐다.Tick 100 : x=0Tick 101 : x=1Tick 102 : x=2그런데 화면은 144 FPS로 그리고 있을 수 있다.그러면 프레임 기준으로:어떤 프레임에서 아직 x = 0다음 Tick이 오기 전까지 계속 x = 0Tick 이 오면 갑자기 x = 1처럼 보여서 툭툭 끊겨 보일 수 있다.그래서 화면에서는 Tick 사이를 보간해서 부드럽게 보여준다. 보간은 어떻게 일어나나?핵심은 accumulator 에 남아 있는 시간 비율이다.예를 들어:Tick 간격 = 0.0333현재 accumula..
Sprial of Death멀티플레이나 고정 Tick 루프 설명할 때 자주 나오는 개념이다. Tick 이 밀려서 한 프레임에 더 많은 Tick 을 처리하려 하고, 그 때문에 프레임이 더 느려지고 그래서 또 더 밀리는 악순환을 의미한다.예를 들어:Tick 간격은 0.033초그런데 어떤 프레임이 갑자기 0.2초 걸림이론상 밀린 Tick이 6번즉, 다음 프레임에서 밀린 6 Tick 한 번에 처리해야한다. 근데 그 6 Tick 처리 자체가 무겁다면:원래 프레임이 느림밀린 Tick 증가해당 Tick 처리하느라 프레임이 더 느려짐더 느려지니 또 시간이 더 쌓임다음 프레임엔 더 많은 Tick 처리해야함 때문에 maxTicksPerFrame 같은 변수로한 프레임에서 처리 가능한 Tick 수 제한을 둬야한다. 이것은 시..
Tick이란?Tick은 게임 규칙이 실제로 진행되는 고정 시간 단위Tick 으로 나누는 이유는 프레임(FPS)이 흔들려도 게임 로직은 같은 속도로 움직이가 하려는 것 예를 들어 tickRate = 30 이면:1초에 30번즉 0.03333초 마다게임 시뮬레이션이 한 칸씩 진행됨이 한 칸을 Tick 1회라고 보면 된다.쉽게 말하면프레임은 화면이 몇 번 그려졌는가?Tick 은 게임 규칙이 몇 번 진행됐는가? 예를 들어, 이동 / 쿨타임 / 공격 판정 / 리스폰 타이머 같은 것은프레임마다 처리하면 PC 성능이 순간 부해에 따라 결과가 흔들릴 수 있다. 그래서 이런 것들은Tick 101Tick 102Tick 103이런 식으로 고정된 간격의 시간축 위에서 진행한다. Tick / Update 나누는 이유Un..
1. 프레임워크란 무엇인가?프레임워크는 한마디로 말하면,어떤 종류의 프로그램을 만들 때 반복적으로 필요한 공통 구조와 규칙을 미리 만들어 둔 뼈대정도로 해석하면 된다.라이브러리와 비슷해 보이지만 아래와 같은 차이가 있다.라이브러리는 내가 필요할 때 가져다 쓰는 도구 모음에 가깝다.프레임워크는 이미 큰 흐름과 구조가 있고, 나는 그 안에서 필요한 부분을 채워넣는다.즉, 라이브러리는 "내가 호출하는 것"이고,프레임워크는 "나를 호출하는 구조"라고 많이 설명한다. 예를 들면:라이브러리: JsonUtility, Netwonsoft Json, LINQ프레임워크: Unity, ASP.NET, Spring, Unreal의 Gameplay FrameworkUnity도 사실 매우 큰 의미에서는 게임 개발 프레임워크다.왜..
메멘토 패턴이란?- 객체의 상태를 저장하고 필요할 때 복원할 수 있도록 하는 패턴- undo 기능 구현할 때 유용- 객체의 캡슐화를 유지하면서 이전 상태를 외부에서 보관하고 관리할 수 있도록 설계 구성 요소1. Original (원본 객체)자신의 상태를 저장할 수 있으며, 저장된 상태를 다시 복원할 수 있음createMemento() 메서드 사용하여 현재 상태를 Memento 객체로 저장restoreMemento() 메서드 사용하여 기존 상태로 복원 가능 2. Memento (메멘토–저장 객체)원본 객체 상태를 저장하는 역할상태 정보를 보관하며, 직접 변경할 수 없음(불변 객체) 3. Caretaker (관리자)여러 개의 Memento 객체를 보관하며, Originator가 요청할 때 적절한 상태를 제공..
미디에이터 패턴이란?- 객체 간의 직접적인 상호 작용을 줄이고, 중앙에서 통신을 중재하는 객체(미디에이터)를 도입하는 패턴 - 객체 간의 의존성을 줄여 유지보수성을 높이고, 결합도를 낮출 수 있음- 여러 객체가 서로 직접 통신하지 않고 미디에이터를 통해 간접적으로 소통 구성 요소1. Mediator (추상 미디에이터)객체 간의 통신을 중재하는 인터페이스 제공객체들이 직접 통신하는 대신, 미디에이터를 통해 소통하도록 유도 2. Concrete Mediator(구체적인 미디에이터)Mediator를 구현하여, 실제 객체 간의 통신을 관리객체 간의 관계를 관리하며 메시지를 중재 3. Colleague (참여 객체)미디에이터를 통해 다른 객체와 통신하는 구성 요소직접 다른 객체와 통신하지 않고, 미디에이터를 통해..