게임 개발 메모장
[ UE5 ] FPS 게임에 대해서 본문
유저끼리 직접 정보를 주고받을 경우 여러 문제가 있을 수 있기 때문에
중간에 서버를 거쳐서 주고 받는다.
P2P 구조는 유저 한명을 임의로 정해서 그 사람 컴퓨터를 서버로 만드는 것. 게임 회사가 서버 비용이 안든다.
서버로 선정된 유저는 ping이 0ms 이 되는 거라 그 사람만 너무 유리하다.
( 1초 = 1000ms )
요즘 실시간 게임들은 보통 데디케이트 서버를 사용하는데 그냥 클라우드 컴퓨터를 한 대 빌려서 그것을 서버로 운영한다. 그래서 요즘 FPS 게임을 한 판 돌린다고 치면 일단 같은 방에 있는 모든 유저가 AWS 같은 곳에 있는 게임 서버 컴퓨터에 연결이 된다.
그래서 누가 어디로 총을 발사 했고 이런 게임 데이터를 주고 받기 시작하면 이제 게임이 돌아가는 거다.
데이터를 주고 받는법
갑자기 어떤 유저가 북쪽으로 10픽셀 정도 움직였다는 정보를 다른 유저들에게도 전달 하려면 정보는 해당 유저 컴퓨터에서 나와서 랜선을 타고 라우터를 거쳐서 이동을 서버에 전달이 된다. 서버는 이 정보가 이상하진 않은지 확인한 다음에 한 유저가 10픽셀정도 움직였다고 다른 유저들에게 해당 정보를 뿌린다.
TCP 대신에 빠르고 가벼운 UDP 를 쓰는데 단점이 중간에 데이터가 사라지거나 아니면 순서가 뒤죽박죽이 되는 경우들이 있다. 그래서 데이터의 순서를 적거나 아니면 현재 시간을 적어서 해결하는 식으로 코드를 짜기도 한다.
Tick Rate
서버를 만들 때 개발자들이 마음대로 TickRate를 설정 할 수 있는데 서버에서 데이터를 유저에게 뿌릴때 1초에 몇번 정도 뿌릴지를 의미한다.
예를 들어 CS GO 라는 게임은 1초에 60번 정도 뿌려주고
대략 16ms 마다 내 움직임을 다른 유저에게 뿌려준다.
발로란트는 1초에 120번 인데 짧은 시간에 많이 뿌려주면 다른 유저들의 실시간 정보를 자주 이렇게 업데이트 받을 수가 있기 때문에 훨씬 스무스하게 게임을 즐길 수가 있을 것
근데 그만큼 서버 비용도 증가한다.
여러 문제 발생
문제 1. Peeker's Advantage
존버하는 사람보다 먼저 움직이는 사람이 유리하다는 것인데
적이 코너에서 이렇게 존버를 하고 있는데 내가 먼저 움직여서 존버하고 있는 적을 발견했다.
동시에 서로를 마주쳐야 되는데 실제로는 먼저 움직인 사람이 존버하는 사람을 이제 먼저 보게 된다.
왜?
모든 유저는 이제 서버에 데이터를 전달하는 데 한 50ms 걸린다고 가정 해보도록 한다.
서버는 TickRate가 60이라 가정하고 내가 상대를 발견할때
내 위치가 서버로 먼저 전달이 된다. 여기서 50ms 소요가 된다.
서버는 내 위치를 다른 사람에게도 이렇게 뿌려줘야 되는데
그러면 다음 TickRate에 이렇게 전송을 해줘야 되니까 여기서 16ms
정도의 시간이 소요가 추가로 되고
존버하고 있던 상대방도 데이터를 받아야 되는데 50ms 정도의 시간이 소요가 되는 것
내가 상대를 발견하고 나서 116ms지나야 상대는 이제 나를 볼 수 있는 것
인간 반응 속도가 대충 200ms 정도고 요즘 좀 빠른 FPS 같은 경우에는 150ms 정도인데
이게 얼마나 큰 어드벤티지인가?
이제 핑이 적을 수록 이런 어드벤티지는 줄어들긴 하는데
FPS 게임은 프로 레벨로 갈 수록 20이나 30ms 정도만 차이가 나도 승률에 유의미한
차이가 있기 때문에 게임할 때 내가 먼저 움직이는 전략도 한번 생각해 보면 좋을 것
문제 2 딜레이
내가 총을 쏴도 상대가 안죽는 현상
내가 쏜 총알이 서버까지 전달이 되어서 처리 되기 까지 시간이 걸린다.
예를 들어 서버까지 내 정보를 전달하는데 80ms가 걸린다고 하면 총을 쏴도
서버에서는 무려 5 Tick이 지나고 나서야 우리가 총을 쐇다는 정보를 받아서 처리하게 될 것
분명히 나는 상대에게 총을 쐈는데 상대는 5Tick이 지날 동안 체력이 실제로 깍이지 않는 그런 상황이 발생
심지어 여기 5Tick 사이에 상대가 위치를 이동까지 해 버리면 우리는 허공에 총질한 것이랑 똑같은 상황
이런 상황에서는 서버에서 딜레이 보상 작업 같은 걸 해주는 작업
지연된 핑만 상대위치를 보정해서 이렇게 계산한다거나 서버 개발자가 할일 유저 입장에서 이런 지연이 발생하면
미리 쏘면 되는거 미리 예측해서 쏘게 되면 내 총알 위치도 더 빠르게 서버에 도착하기 때문에
핑이 높을수록 그런 식으로 게임을 하는게 유효 전략이 될 수 있다.
문제 3. 패킷 로스
인터넷 상황이 안좋으면 서버로 데이터를 전달할 빵꾸가 날 수도 있다.
보통 패킷 로스라고 하고 이게 많으면 상대 유저 좌표 같은 것도 빵꾸가
나서 전달이 되기 때문에 순간 이동 현상이 나올 수 있다.
예를 들어 팀마다 유저 좌표가 서버로 전달이 되는데
중간에 빵꾸가 나면 유저가 갑자기 순간이동 하는 것처럼 보이겠다.
게임 서버에서 문제를 해결하기 위해서 빵꾸난 좌표 부분을 예측을 해버리는 것
머신러닝을 쓰던 해서
유저 좌표가 다른 유저들에게 부드럽게 전달이 되도록 빵꾸를 이렇게 채워버리는 것이다.
하지만, 가끔 서버에서 이렇게 유저 좌표를 예측한게 틀리는 경우들이 발생할 수 있다.
빵꾸난 부분을 3이라고 예측을 했는데 실제 유저는 2에서 가만이 있었다.
그러면 내가 3위치에 있는 상대를 쐇는데 상대에게 반영이 안되는 문제가 생길 수도 있는 것이다.
출처:
https://www.youtube.com/watch?v=YHswt4VCeJs&list=WL&index=204
'언리얼 엔진 > 정보' 카테고리의 다른 글
[ UE5 ] Visual Studio C++를 이용한 디버깅 (0) | 2024.01.03 |
---|---|
[ UE5 ] 언리얼에서 절대 Raw Pointer를 사용하지마라 (0) | 2024.01.01 |
[ UE5 ] Visual Studio 용법 (0) | 2024.01.01 |
[ UE5 ] 언리얼 엔진 Visual Studio 세팅 (0) | 2023.12.31 |
[ UE5 ] FPS 게임에서 '프레임'의 중요성 (1) | 2023.12.23 |