롤 집중포화나 뱀서 멀티같은 게임들은 수백~수천 개의 적들/projectile들이 나오는데 이걸 다 network transform으로 동기화 시킬 수는 없을 거 같은데 어떻게 해결하는지 잘 몰라서 물어봄
플레이어가 조종하는 캐릭터들 위치만 동기화되고 spawn될 때 초기조건만 동기화해서 이후에는 초기조건 동일하면 똑같이 작동한다는 걸 전제로 local에서 처리하나?
- dc official App
댓글 18
처리가능함. 잡큐 만들어놓고 한번에 처리하게하면 응답시간 깐깐하게 안보면 알빠노로 가능
익명(pke4568)2025-02-03 19:11:00
락스텝프로토콜 개념을 공부하면 됨
각 오브젝트를 동기화 하는것이 아닌 패킷을 동기화 시켜
ㅇㅇ 1(106.102)2025-02-03 19:13:00
답글
해당 방식으로 게임 제작시 탄막 오브젝트가 수만이면 시퓨 부하는 먹겠지만 네트웤 부하는 없음
ㅇㅇ 1(106.102)2025-02-03 19:14:00
일단 뭘 봐야하는지는 알겠네 둘 다 ㄱㅅㄱㅅ - dc App
호붕(scar4464)2025-02-03 19:17:00
솔직히 뭔 구대기같은 방식을 쓰던 서너명정도 끼리 동기화 하는거면 뭘로 해도 요즘 세상에는 어떻게든 여유롭게 돌아감; C로 짠 스타 배틀넷이나 디아멀티방같은게 20년전 기술인데 여전히 잘만돌아가고요. 스타같은거 4인 풀방 기준 동시 동기화 해야할 오브젝트 천개 넘어가는데 여유롭죠? 서너명이 같이 하는건 서점에서 파는 가벼운 따라하기 정도 수준의 기술로도 최적화 고려하지 않아도 잘 돌아감; 100명 200명 이런수준에서부터가 문제지
oo(112.166)2025-02-03 20:11:00
답글
뭐 그래도 제대로 하는 방법 배워두는 게 좋지 않을까 해서 - dc App
호붕(scar4464)2025-02-03 20:14:00
탄막이나 이펙트의 좌표, 상태 등등 모든 데이터를 직렬화 하지 말고 탄막이나 이펙트의 생성과 제거 시에만 이벤트 방식으로 주고받으면 되긴함.
이렇게 하면 탄막이랑 이펙트들을 관리해주는 객체 하나에서만 패킷 받으면 되니까. 대신 관리는 좀 더 까다로워짐
ㅇㅇ 2(61.85)2025-02-03 20:45:00
답글
잡큐 쓰는 거랑 비슷하려나 ㄱㅅㄱㅅ - dc App
호붕(scar4464)2025-02-03 22:58:00
스타크래프트 같은 RTS(실시간 전략) 게임에서 수천 개의 유닛과 건물을 동기화하는 네트워크 시스템은 일반적인 FPS나 MOBA 게임과는 다른 방식이 필요해. 보통 **Lockstep Simulation(락스텝 시뮬레이션)**과 Input Delay(입력 지연) 같은 기법을 조합해서 사용하지.
1. 락스텝 시뮬레이션 (Lockstep Simulation)
모든 클라이언트(플레이어)가 동일한 입력을 공유하고, 동일한 게임 상태를 시뮬레이션하도록 설계.
개별 유닛이나 건물의 상태를 직접 전송하는 게 아니라, 플레이어의 입력(Command)을 동기화함.
예를 들어, "마린 10기를 선택하고, A 지역으로 이동"하는 명령만 동기화하면 됨.
그러면 각 클라이언트는 명령을 받은 후 같은 프레임에서 동일한 결과를 계산
ㅇㅇ 3(220.83)2025-02-03 22:33:00
답글
2. 입력 지연 (Input Delay)
모든 클라이언트가 일정한 프레임 단위(예: 8프레임)로 입력을 미리 받아서 처리.
네트워크 지연을 흡수하고 동기화를 맞추기 위해 게임이 몇 프레임 뒤의 입력을 사용하게 함.
그래서 스타크래프트에서 빠른 움직임을 할 때도 유닛이 약간의 딜레이 후에 반응하는 느낌이 있음.
ㅇㅇ 3(220.83)2025-02-03 22:33:00
답글
3. 리플레이 기반 동기화 (Deterministic Simulation)
RTS 게임은 보통 결정론적(Deterministic) 동기화 방식을 사용해서 리플레이 데이터를 저장할 수 있음.
즉, 같은 입력이 들어오면 모든 클라이언트에서 동일한 결과를 보장해야 함.
이를 위해 부동소수점 연산을 피하거나, 특정 연산을 정수로 변환하는 등의 기법을 사용.
4. 롤백 & 재동기화 (Rollback & Resynchronization)
네트워크 환경이 나빠서 데이터가 유실되거나 동기화가 어긋날 경우, 이전 상태로 롤백 후 다시 연산.
이를 위해 게임은 일정 주기마다 상태를 체크포인트로 저장하고, 문제가 생기면 복구함.
ㅇㅇ 3(220.83)2025-02-03 22:34:00
답글
4. 롤백 & 재동기화 (Rollback & Resynchronization)
네트워크 환경이 나빠서 데이터가 유실되거나 동기화가 어긋날 경우, 이전 상태로 롤백 후 다시 연산.
이를 위해 게임은 일정 주기마다 상태를 체크포인트로 저장하고, 문제가 생기면 복구함.
5. 대역폭 최적화
전체 유닛의 상태를 실시간으로 보내는 게 아니라, 명령 기반 업데이트만 전송.
특정 유닛이 가만히 있으면 아무 데이터도 보내지 않고, 명령이 있을 때만 정보를 동기화함.
시야(FOG OF WAR) 개념을 이용해, 유저가 보지 않는 곳의 정보는 최소화해서 전송.
ㅇㅇ 3(220.83)2025-02-03 22:34:00
답글
정리
스타크래프트 같은 RTS에서 수천 개의 유닛을 동기화할 때는:
락스텝 시뮬레이션으로 입력만 동기화.
**입력 지연(Input Delay)**을 둬서 네트워크 상태를 맞춤.
결정론적 동기화를 보장해 같은 입력에서 같은 결과가 나오게 함.
필요할 경우 롤백을 통해 동기화 문제를 해결.
최소한의 데이터(명령 기반 전송)만 네트워크로 주고받음.
이런 방식 덕분에, 스타크래프트 같은 고전 RTS 게임이 낮은 대역폭에서도 원활하게 작동할 수 있는 거야. +
ㅇㅇ 3(220.83)2025-02-03 22:35:00
이미 충분한 자료가 있는 시스템적인 구현 문제는 ai에게 물어보는게 제일 빠르고 확실함
ㅇㅇ 3(220.83)2025-02-03 22:36:00
답글
ai 답변도 좋긴 한데 다른 사람들이 어떻게 하는지도 알고 싶어서
아래 긴 답변 ㄱㅅㄱㅅ - dc App
호붕(scar4464)2025-02-03 23:01:00
게임을 결정론적으로 만들면 됨
익명(hotkey02)2025-02-03 23:14:00
답글
입력이 동일하면 똑같은 결과가 나오도록 만들면 입력만 신경쓰면 동일한 상태를 보장 할 수 있어
네트워크로 전송되는건 탄막 하나하나의 상태가 아니라 유저가 행한 총알 발사 같은 입력을 전송하는거야
처리가능함. 잡큐 만들어놓고 한번에 처리하게하면 응답시간 깐깐하게 안보면 알빠노로 가능
락스텝프로토콜 개념을 공부하면 됨 각 오브젝트를 동기화 하는것이 아닌 패킷을 동기화 시켜
해당 방식으로 게임 제작시 탄막 오브젝트가 수만이면 시퓨 부하는 먹겠지만 네트웤 부하는 없음
일단 뭘 봐야하는지는 알겠네 둘 다 ㄱㅅㄱㅅ - dc App
솔직히 뭔 구대기같은 방식을 쓰던 서너명정도 끼리 동기화 하는거면 뭘로 해도 요즘 세상에는 어떻게든 여유롭게 돌아감; C로 짠 스타 배틀넷이나 디아멀티방같은게 20년전 기술인데 여전히 잘만돌아가고요. 스타같은거 4인 풀방 기준 동시 동기화 해야할 오브젝트 천개 넘어가는데 여유롭죠? 서너명이 같이 하는건 서점에서 파는 가벼운 따라하기 정도 수준의 기술로도 최적화 고려하지 않아도 잘 돌아감; 100명 200명 이런수준에서부터가 문제지
뭐 그래도 제대로 하는 방법 배워두는 게 좋지 않을까 해서 - dc App
탄막이나 이펙트의 좌표, 상태 등등 모든 데이터를 직렬화 하지 말고 탄막이나 이펙트의 생성과 제거 시에만 이벤트 방식으로 주고받으면 되긴함. 이렇게 하면 탄막이랑 이펙트들을 관리해주는 객체 하나에서만 패킷 받으면 되니까. 대신 관리는 좀 더 까다로워짐
잡큐 쓰는 거랑 비슷하려나 ㄱㅅㄱㅅ - dc App
스타크래프트 같은 RTS(실시간 전략) 게임에서 수천 개의 유닛과 건물을 동기화하는 네트워크 시스템은 일반적인 FPS나 MOBA 게임과는 다른 방식이 필요해. 보통 **Lockstep Simulation(락스텝 시뮬레이션)**과 Input Delay(입력 지연) 같은 기법을 조합해서 사용하지. 1. 락스텝 시뮬레이션 (Lockstep Simulation) 모든 클라이언트(플레이어)가 동일한 입력을 공유하고, 동일한 게임 상태를 시뮬레이션하도록 설계. 개별 유닛이나 건물의 상태를 직접 전송하는 게 아니라, 플레이어의 입력(Command)을 동기화함. 예를 들어, "마린 10기를 선택하고, A 지역으로 이동"하는 명령만 동기화하면 됨. 그러면 각 클라이언트는 명령을 받은 후 같은 프레임에서 동일한 결과를 계산
2. 입력 지연 (Input Delay) 모든 클라이언트가 일정한 프레임 단위(예: 8프레임)로 입력을 미리 받아서 처리. 네트워크 지연을 흡수하고 동기화를 맞추기 위해 게임이 몇 프레임 뒤의 입력을 사용하게 함. 그래서 스타크래프트에서 빠른 움직임을 할 때도 유닛이 약간의 딜레이 후에 반응하는 느낌이 있음.
3. 리플레이 기반 동기화 (Deterministic Simulation) RTS 게임은 보통 결정론적(Deterministic) 동기화 방식을 사용해서 리플레이 데이터를 저장할 수 있음. 즉, 같은 입력이 들어오면 모든 클라이언트에서 동일한 결과를 보장해야 함. 이를 위해 부동소수점 연산을 피하거나, 특정 연산을 정수로 변환하는 등의 기법을 사용. 4. 롤백 & 재동기화 (Rollback & Resynchronization) 네트워크 환경이 나빠서 데이터가 유실되거나 동기화가 어긋날 경우, 이전 상태로 롤백 후 다시 연산. 이를 위해 게임은 일정 주기마다 상태를 체크포인트로 저장하고, 문제가 생기면 복구함.
4. 롤백 & 재동기화 (Rollback & Resynchronization) 네트워크 환경이 나빠서 데이터가 유실되거나 동기화가 어긋날 경우, 이전 상태로 롤백 후 다시 연산. 이를 위해 게임은 일정 주기마다 상태를 체크포인트로 저장하고, 문제가 생기면 복구함. 5. 대역폭 최적화 전체 유닛의 상태를 실시간으로 보내는 게 아니라, 명령 기반 업데이트만 전송. 특정 유닛이 가만히 있으면 아무 데이터도 보내지 않고, 명령이 있을 때만 정보를 동기화함. 시야(FOG OF WAR) 개념을 이용해, 유저가 보지 않는 곳의 정보는 최소화해서 전송.
정리 스타크래프트 같은 RTS에서 수천 개의 유닛을 동기화할 때는: 락스텝 시뮬레이션으로 입력만 동기화. **입력 지연(Input Delay)**을 둬서 네트워크 상태를 맞춤. 결정론적 동기화를 보장해 같은 입력에서 같은 결과가 나오게 함. 필요할 경우 롤백을 통해 동기화 문제를 해결. 최소한의 데이터(명령 기반 전송)만 네트워크로 주고받음. 이런 방식 덕분에, 스타크래프트 같은 고전 RTS 게임이 낮은 대역폭에서도 원활하게 작동할 수 있는 거야. +
이미 충분한 자료가 있는 시스템적인 구현 문제는 ai에게 물어보는게 제일 빠르고 확실함
ai 답변도 좋긴 한데 다른 사람들이 어떻게 하는지도 알고 싶어서 아래 긴 답변 ㄱㅅㄱㅅ - dc App
게임을 결정론적으로 만들면 됨
입력이 동일하면 똑같은 결과가 나오도록 만들면 입력만 신경쓰면 동일한 상태를 보장 할 수 있어 네트워크로 전송되는건 탄막 하나하나의 상태가 아니라 유저가 행한 총알 발사 같은 입력을 전송하는거야
각각의 프로젝타일을 각각 전송하는게 아니라 하나의 패킷으로 만들어서 쏴라