블로그 이미지
지누구루

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2015. 1. 27. 20:59 공부

먼저, 온라인이 아닌 게임에서의 타격 과정에 대해서 살펴 보겠습니다.

여러 액션게임중에서도 일단은 쉽게 설명하기 위해서, 1:1 대전 게임을 생각해 보겠습니다.

1:1 대전게임이면 1P의 캐릭터 A, 2P의 캐릭터 B가 있다고 가정하겠습니다.

 

일반적으로 게임은 일정 시간(대부분은 1프레임)동안 입력된 동작을 모아서

다음 프레임에 그 입력에 대한 액션을 실행하는 형태로 진행이 됩니다.

(이걸 프레임이라고 해야 하는지 정확한 용어는 모르겠지만, 내부에서는 저는 Tick이란 용어를 사용합니다. 이해를 위해서 일단 게이머들에게 익숙한 프레임이라는 표현을 사용했습니다. 게이머들에게 입력이나 화면 갱신의 최소단위가 프레임인거 같아서 입니다.)

 

온라인이 아닌 게임에서는

1) 1P가 공격 버튼을 입력 

2) 다음 프레임에 A의 공격이 나감과 동시에 타격이 발생(타격판정 발생 프레임 같은 내용은 일단 무시)

3) 같은 프레임에 데미지 계산

4) 같은 프레임에 발생한 데미지에 대한 B의 체력 게이지 화면 정보 갱신

공격의 발생부터 타격, 그리고 데미지 계산, 그리고 데미지의 표시까지 한번의 프레임에서 모두 나타낼 수 있습니다(2,3,4번 과정)

 

그렇다면 온라인 게임에서는 어떤게 달라질까요?

데미지 계산을 어떤 방식으로 하냐에 따라서 크게 달라질 수 있지만,

보통 클라이언트 해킹(변조)의 위험으로부터 보호 하기 위해 "데미지 계산"을 서버에서 하는 경우가 일반적입니다.

(충돌체크까지 서버에서 하는 경우도 있습니다)

 

그렇다면 위에서 말한 2)번 단계 이후 인 데미지 계산 -> 적용의 과정이 한 프레임에서 일어나지 않게 됩니다.

즉, 타격이 발생했으니까 처리를 해달라! 라고 서버로 요청하게 되고, 응답을 받을 때까지 시간이 흐르게 됩니다.

문제는 이게 온라인, 즉, 네트워크를 타고 움직이기 때문에, 항상 일정하지 않고, 몇 초후에 올 수도 있습니다,

이 과정에서, 온라인상에서 응답시간이 길어져서, 늦게 오게 되는 현상이 일반적으로 서버측 "렉"이라고 부르는 녀석입니다.

 

이 렉에 대한 처리를 어떤 방식으로 하느냐에 따라서, 렉이 나타나는 현상도 다르게 되는데,

제가 아는 현상중에 아래와 같은 것들이 해당됩니다.

 

1) 버튼을 눌렀는데, 공격이 한참 뒤에 나감

- 공격의 발생도 서버의 통신 후에 나가는 경우입니다. 구지 검증이나 데미지 처리가 아니더라도, 서버로 부터 응답을 받고 공격이 발생하는 경우는 이런 렉이 발생합니다.

 

2) 공격은 나갔고, 타격도 발생했는데, 데미지가 나~~중에 들어감

- 공격 발생과 타격은 서버통신을 거치지 않고 먼저 실행 하고, 데미지 계산을 서버 응답으로 처리하는 경우입니다. 보통 타격 피드백을 중요시 하는 게임에서 많이 사용하는 방법입니다.

 

3) 공격은 나갔고, 타격도 발생, 데미지도 이미 들어간 거 같은데, 나중에 갑자기 상대방의 체력이 변경됨.

(상대방의 체력을 다 깎았는데, 안죽는 경우도 이쪽 계열)

- 공격 발생과 타격, 데미지 계산까지 클라이언트에서 했지만, 서버 응답에 의해 보정을 하는 경우 입니다. 2번 경우보다 타격감이 좀 더 좋지 않나.. 하고 생각합니다.

 

 개인적인 생각으로는 약간 예외적인 케이스가 디아블로3가 아니었나 싶습니다. 특히 마법이나 화살같은 투사체의 경우인데, 공격을 쏘는 모션자체는 클라이언트에 바로 뿌려주지만, 투사체의 발생 자체가 서버렉으로 인해 늦게 나가는 경우였습니다. 정확한 방식은 발표된 바가 없어서 알 수 없지만, 투사체 발생자체는 서버검증과 계산을 거쳐서 발생하는데, 공격 모션은 이와 상관없이 재생되는 경우였다고 생각합니다.

 

 

이런 현상에서 한발짝 더 나가서 생각을 해봅시다.

사실 진짜로 하고 싶었던 이야기는 이쪽입니다 ㅎㅎ

지금까지 설명한 내용을 요약하면 'A가 B를 타격하면 서버를 거쳐서 데미지 계산이 된다'이며,

'처리방식에 따라서 서버렉이 나타나는 유형도 다르다'는 것도 간단히 설명하였습니다.

 

자 여기서 이제 1:1 게임이 아니라, 여러 캐릭터가 다수의 몬스터를 타격하는 게임에 이 방식을 적용한다고 생각해 봅시다.

특히, 범위타격의 기술을 10마리의 몬스터가 모여 있는 곳에 내려치는데, 이 공격이 초당 5회 공격을 한다고 가정해 봅시다.

단순 계산으로 아무 최적화도 거치지 않는다면. 이론상 1회의 공격으로 1초간 50개의 패킷이 발생합니다(10마리 * 5회).

10마리고 초당 5회라고 가정했을때 이정도인데,

만약에 4명의 파티원이 30마리의 몬스터가 있는 곳에 같은 기술을 동시에 사용했다고 가정하면?

4(파티원) * 30 * 5 = 600

초당 600개의 패킷이 하나의 서버에 몰리게 됩니다.

물론 이 4명만 있으면 초당 600개 패킷을 처리하는건 크게 문제가 안될 수 있지만....

동시에 플레이 하는 유저가 몇천명, 몇만명 단위가 된다면?

 

그렇기 때문에 위에 말한 내용을 최적화 하는 과정이 필요하게 됩니다.

일정 시간내 데미지 계산을 몰아서 한다던지,

스킬에 의한 총 데미지 계산은 한번에 하고 보여주는 것만 나눠서 보여준다던지 하는 방법들을 사용하게 됩니다.

하지만 이런 방법들은 실제 게임 플레이의 타격감이나, 좋은 피드백에 영향을 줄 수 있기 때문에, 실제 개발시에 어떤 방법으로 최적화 할지 결정하는 것도 중요한 요소입니다.

 

다시 한번 말하면, 서버에 의한 데미지를 계산하는 이유는, 클라이언트에서 이 계산을 하게 되면, 클라이언트 해킹으로 마음대로 데미지를 줄 수 있게 될 가능성이 열리기 때문입니다.

(이런 것 때문에 위치 검증이나, 충돌체크도 서버에서 하는 경우도 있는거라고 보시면 됩니다)

 

하지만 이런 최적화도, 결국 절대적인 타격수(패킷수) 앞에서는 장사가 없습니다.

그렇기 때문에 온라인으로 여러명의 유저가 동시에 몬스터와 싸우는 게임들은 보통

(1) 파티원의 수

(2) 동시 출현 몬스터의 수

(3) 범위 스킬인데 동시타격 개체의 수

가 제한되게 됩니다.

(또는 몬스터를 멀리 떨어뜨려 소환하고, 구역별로 처리를 따로 하는 방법이라던가)

 

이런 것을 제한하지 않고, 마음껏 할 수 있게 하고, 동시 발생 패킷수가 많아지면,

결국 서버의 초당 패킷 처리 속도를 초과하여, 서버에 처리못한 패킷이 쌓이게 되고,

결국 서버가 점점 느려져서 문제가 발생하게 됩니다.

 

물론 단순히 하나의 서버에 접속하는 접속자의 수를 제한하고,

사람이 늘어날수록 서버를 늘려서 대응하는 방법도 있습니다.

특히 요즘은 클라우드 컴퓨팅에 의해서, 서버 추가 삭제가 쉬워졌기 때문에, 이 방법도 어느정도 희망이 있지만,

반응성을 중요시하는 액션게임의 서버로 클라우드 서버를 사용하는 것은 아직은 시기 상조가 아닌가 싶습니다.

(물론 개인적인 의견입니다)

 

 

틀린 내용이 있으면 지적 감사히 받겠습니다.

 

posted by 지누구루